541. 反转字符串 II
写了一个通用的翻转函数 然后用到了指针做下标的思想
其实写复杂了,reverse可以直接调库,然后可以用一个for循环做起点,终点加个长度就ok了
class Solution {
public:
// 将s的[L, R]范围内翻转
void reverseS(string& s, int L, int R)
{
int i = L, j = R;
while (i < j)
{
swap(s[i++], s[j--]);
}
}
string reverseStr(string s, int k) {
int n = s.size();
int end = 0;
while (end < n)
{
int length = n - end;
if (length < k)
{
reverseS(s, end, n - 1);
end = n;
}
else
{
reverseS(s, end, end + k - 1);
end += 2*k;
}
}
return s;
}
};
剑指 Offer 58 - II. 左旋转字符串
技巧性
class Solution {
public:
string reverseLeftWords(string s, int n) {
string t = s + s;
return t.substr(n, s.size());
}
};
151. 反转字符串中的单词
我的思路是:先去前后空格(似乎是多余的),整体翻转后对单个单词翻转。再遍历一遍去掉多余的空格
class Solution {
public:
// 整体翻转后对单个单词翻转
string reverseWords(string t) {
int L = 0, R = t.size() - 1;
while (L < R && t[L] == ' ') L++;
while (L < R && t[R] == ' ') R--;
string s = t.substr(L, R-L+1);
reverse(s.begin(), s.end());
int n = s.size();
for (int i = 0; i < n; i ++)
{
int j = i;
while (j < n && s[j] != ' ') j ++;
reverse(s.begin() + i, s.begin() + j);
i = j;
}
// 去除中间的空格
string res;
for (int i = 0; i < s.size(); i ++)
{
if (s[i] == ' ') continue;
int j = i + 1;
while (j < n && s[j] != ' ') j ++;
res += s.substr(i, j-i);
res += " ";
i = j;
}
res.pop_back();
return res;
}
};