** 151.翻转字符串里的单词 **
leetcode链接:https://leetcode.cn/problems/reverse-words-in-a-string/
题目描述:给你一个字符串 s ,请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
核心思路:使用双指针进行去空格,主要需要注意的是空格去除的逻辑。
点击查看代码
```cpp
class Solution {
public:
void reverse(string &s,int start,int end){//这里是交换单个单词,不能重置start
for(;start < end;start++,end--){
swap(s[start],s[end]);
}
}
string reverseWords(string s) {
int fast = 0,slow = 0;
bool need = false;
for(;fast < s.size();fast++){//使用bool来判断来处理空格更简单
if(s[fast] != ' '){
s[slow++] = s[fast];
need = true;
continue;
}
if(need){
s[slow++] = ' ';
need = false;
}
}
if(s[slow-1]==' '){//需考虑最后一位为空格的情况,如果为空格要去掉
s.resize(slow-1);
}
else {s.resize(slow);}
slow = 0,fast = s.size() - 1;
while(slow < fast){//交换首尾的单词
swap(s[slow],s[fast]);
slow++,fast--;
}
slow = 0,fast = 0;
for(;fast <= s.size();fast++){//遍历每个单词,分别处理每个单独的单词
if(fast == s.size() || s[fast] == ' '){
reverse(s,slow,fast-1);
slow = fast + 1;
}
}
return s;
}
};
</details>