151.翻转字符串里的单词
要点:双指针移除多余的空格,想了很久才想明白
方法:
1. 移除多余空格
1.1 碰到字母,快慢指针一起走
1.2 快指针碰到空格,先走,不管慢指针,直到碰到字母再停下
1.3 快指针碰到字母停下后,慢指针加入一个空格,前移一位
1.4 第一个单词做一下特殊处理
2. 去除多余空格后,整个字符串先反转
3. 遍历字符串,碰到空格或者直到字符串末尾,将单词原地反转
class Solution {
public:
void reverse(string& s, int begin, int end) {
for (; begin < end; begin++, end--) {
swap(s[begin], s[end]);
}
}
void removeExtraSpaces(string& s) {
int slow = 0;
for (int fast = 0; fast < s.size(); fast++) {
if (s[fast] != ' ') {
if (slow != 0)
s[slow++] = ' ';
while (fast < s.size() && s[fast] != ' ') {
s[slow++] = s[fast++];
}
}
}
s.resize(slow);
}
string reverseWords(string s) {
removeExtraSpaces(s);
reverse(s, 0, s.size() - 1);
int start = 0;
for (int i = 0; i <= s.size(); i++) {
if (i == s.size() || s[i] == ' ') {
reverse(s, start, i - 1);
start = i + 1;
}
}
return s;
}
};
55.右旋转字符串
要点:两种思路,先整体反转,再局部反转;或者先局部反转,再整体反转
方法:
1. 整体反转
2. 局部反转
3. 总共反转三次
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int n;
string s;
cin >> n;
cin >> s;
reverse(s.begin(), s.end());
reverse(s.begin(), s.begin() + n);
reverse(s.begin() + n, s.end());
cout << s << endl;
}