我的解法:(双指针从左往右遍历,效率差,不使用)
思想:
双指针获得每个单词,然后连起来。
复杂度:
string的相加效率很低
缺点:
从左往右遍历时,后面的答案需要添加到字符串左边,所以效率很低。
从右往左遍历时,直接用+=就好
代码:
class Solution {
public:
string reverseWords(string s) {
if(s.empty())
return "";
int left = 0, right = 0;
string ans = "";
while(right < s.size()){
while(s[right] != ' ' && right < s.size())
right++;
if(right - left > 0){
ans = s.substr(left, right - left) + ans;
ans = " " + ans;
}
while(s[right] == ' ' && right < s.size())
right++;
left = right;
}
if(ans.empty())
return "";
return ans.substr(1, ans.size() - 1);
}
};
正确解法1:双指针从右向左
思想:
复杂度:
代码注意点:
●遍历顺序,左到右还是右到左?
●right和left哪个要判断 < 0?
●找到一个单词后,怎么更新left/right来继续下一次遍历?
●返回值的分类讨论?
代码:
class Solution {
public:
string reverseWords(string s) {
string res = "";
int s_size = s.size();
if(s_size == 0)
return "";
int right = s_size - 1;
while(right >= 0){
//从后往前寻找第一字符
while(s[right] == ' ' && right >= 0)
right--;
//right为-1会报错,而left为-1不会有问题,所以只要判断right
if(right < 0)
break;
//从后往前寻找第一个空格
int left = right;
while(left >= 0 && s[left] != ' ')
left--;
//添加单词到结果
res += s.substr(left + 1, right - left);
res += ' ';
//更新right到left,下次从这里开始访问
right = left;
}
if(!res.empty())
res.pop_back();
return res;
}
};
解法2:istringstream
https://leetcode-cn.com/problems/fan-zhuan-dan-ci-shun-xu-lcof/solution/cshuang-bai-zhan-by-orange-32/
扫描二维码关注公众号,回复:
12663832 查看本文章
![](/qrcode.jpg)