本题是使用双指针(快慢指针法)的一道综合性问题。首先通过快慢指针对字符串中多余的空格进行清除,随后要对整个串进行一次反转操作,再要通过快慢指针来界定单词的边界,最后要对串中每一个单词再进行反转。
class Solution {
public:
string reverseWords(string s) {
removeExtraSpaces(s); // 使用双指针法去除多余空格
tranverse(s, 0, s.length() - 1);
// 使用双指针法截取单词
int slow = 0;
int fast = 0;
for(; fast < s.length(); fast ++) {
if(s[fast] == ' ') {
tranverse(s, slow, fast - 1);
slow = fast + 1;
}
}
tranverse(s, slow, fast - 1);
return s;
}
// 快指针遇到多余的空格自增,慢指针不动;快指针遇到非多余的空格,将快指针指向的值赋给慢指针,快慢指针同时自增。最终慢指针所在的位置就是去除字符串中间空格后的子串末尾(还需去除末尾的空格)
void removeExtraSpaces(string& s) {
int slow = 0, fast = 0; // 定义快指针,慢指针
while (fast < s.size() && s[fast] == ' ') { // 去掉字符串前面的空格
fast++;
}
for (; fast < s.size(); fast++) { // 去掉字符串中间部分的冗余空格
if (fast - 1 > 0 && s[fast - 1] == s[fast] && s[fast] == ' ') {
continue;
} else {
s[slow++] = s[fast];
}
}
if (slow - 1 > 0 && s[slow - 1] == ' ') { // 去掉字符串末尾的空格
s.resize(slow - 1); // 重新设置字符串大小
} else { // if不满足,说明字符串末尾无空格
s.resize(slow); // 重新设置字符串大小
}
}
void tranverse(string& s, int begin, int end) {
for(;begin < end; begin ++, end --) {
swap(s[begin], s[end]);
}
}
};