思路:首先将所有空格规范化,将字符串改为规范的形式,再将整个字符串进行翻转,最后将每一个独立的单词再次翻转。
难点1:如何删去重复空格?
可以采用双指针的思路,设置快慢指针,思路同移除数组元素,本题就是移除空格,并在第一次遇到非空格时增添空格(要保证slow!=0即保证不是第一个元素),然后while遍历赋值此单词。
难点2:如何翻转各个单词?
首先设置一个start,作为每一个单词的起始位置,再用一个for循环即可,遇到空格则翻转(start,i-1),再用start=i+1,更新每一个start位置
class Solution {
public:
void reverse(string& s, int start, int end){ //翻转,区间写法:左闭右闭 []
for (int i = start, j = end; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
void removeExtraSpaces(string& s) {//去除所有空格并在相邻单词之间添加空格, 快慢指针。
int slow = 0; //整体思想参考https://programmercarl.com/0027.移除元素.html
for (int i = 0; i < s.size(); ++i) { //
if (s[i] != ' ') { //遇到非空格就处理,即删除所有空格。
if (slow != 0) s[slow++] = ' '; //手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。
while (i < s.size() && s[i] != ' ') { //补上该单词,遇到空格说明单词结束。
s[slow++] = s[i++];
}
}
}
s.resize(slow); //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(s[i]==' '||i==s.size()){
reverse(s,start,i-1);
start=i+1;
}
}
return s;
}
};
bug:最后一部分翻转,i应该是<=s.size(),因为是左闭右闭的翻转,所以每一次翻转是i-1,那么要翻转start到s.size()-1,i就应该等于s.size().
1922

被折叠的 条评论
为什么被折叠?



