原题链接:151. 颠倒字符串中的单词
solution:
本题分为三个步骤:
① 遍历字符串把无效的空格删除
② 将字符串中的每一个单词进行翻转
③ 最后将整个字符串进行翻转
考虑到题目要求原地修改,并且O(1)额外空间复杂度,代码如下:
① 首先遍历字符串的时候遇到空格就跳过,这样就可以处理字符串头部的空格。
② 直到遇到单词就停下,将单词向前拷贝,并颠倒顺序。
③ 每向前拷贝一个单词就在单词末尾添加一个空格,保证格式正确。
④ 最后处理字符串末尾的空格
⑤ 颠倒整个字符串
class Solution {
public:
string reverseWords(string s) {
int k = 0;
int n = s.length();
for(int i = 0;i < n;i++) {
if(s[i] == ' ') continue; //遇到空格就跳过,知道遇到单词
int j = i,t = k;
while(j < n && s[j] != ' ') s[t++] = s[j++]; //将单词复制
reverse(s.begin() + k,s.begin() + t); //复制后点得单词颠倒
s[t++] = ' '; //单词后添加一个空格
k = t,i = j; //更新指针
}
if(k) k--;
s.erase(s.begin() + k,s.end()); //将末尾空格删掉
reverse(s.begin(),s.end()); //最后反转单词
return s;
}
};