一.相关链接
题目链接:151.翻转字符串里的单词
二.心得体会
这是一道经典的字符串题目,这里需要我们做两件事:第一是要删除多余的空格,第二是要逐个翻转单词。删除多余的空格可以通过快慢指针实现,当遇到非空格字符时手动加空格作为新单词的开头并连续遍历直到读完这个单词为止,在此之后移动慢指针到快指针前一位即可。逐个翻转单词的重点是找到每个单词后的空格,依然是通过快慢指针解决。
三.代码
class Solution {
public:
string reverseWords(string s) {
int old_len = s.size();
int slow = 0;
int fast = 0;
//去除多余空格
for(;fast<old_len;fast++){
//每当遇到需要写入的单词时
if(s[fast]!=' '){
//第一个单词不需要加空格
if(slow!=0){
s[slow] = ' ';
slow++;
}
//一直写入直到遇到空格,注意边界判定
while(s[fast]!=' '&&fast<old_len){
s[slow] = s[fast];
fast++;
slow++;
}
}
}
//slow就是新的字符串长度,这里不用减一因为索引比长度小一,多加的一刚好抵消
s.resize(slow);
reverse(s.begin(),s.end());
slow = 0;
fast = 0;
for(;fast<s.size();fast++){
//遇到空格就进行翻转,注意左闭右开的原则
if(s[fast]==' '){
reverse(s.begin()+slow,s.begin()+fast);
slow = fast + 1;
}
//最后一个单词特殊处理
else if(fast == s.size()-1){
reverse(s.begin()+slow,s.end());
}
}
return s;
}
};