LeetCode 557: 反转字符串中的单词 III
题目描述
解题
双指针+逐单词反转
很直观地,双指针确定每个单词的范围,然后逐个单词反转就够了。
反转的时候可以借助reverse函数:
class Solution {
public:
string reverseWords(string s) {
for (int i=0, j=0; i<s.size();){
while (j<s.size() && s[j]!=' ')
++j;
reverse(s.begin()+i, s.begin()+j);
++j;
i=j;
}
return s;
}
};
也可以用swap,当然借助第三个变量交换值也可以。
class Solution {
public:
string reverseWords(string s) {
for (int i=0, j=0; i<s.size();){
while (j<s.size() && s[j]!=' ')
++j;
int k=j-1;
while (i<k){
swap(s[i],s[k]);
++i;
--k;
}
++j;
i=j;
}
return s;
}
};
下面是一些思路,但个人觉得有点绕远的方法。
借助stack反转单词
依据stack先入后出的特性,将单词的字符依次压栈,再弹栈实现单词反转的效果
反转字符串+stack/deque
先用reverse或swap等将整个字符串反转,此时每个单词是反转过的,单词的顺序也是反转过的,将每个单词逐个压栈再弹栈,使得单词的顺序与原字符串一致,需要注意空格。