输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
为简单起见,标点符号和普通字母一样处理。
例如输入字符串"I am a student."
,则输出"student. a am I"
。
样例
输入:"I am a student."
输出:"student. a am I"
算法1(双指针算法) $O(n)$
首先,我们要有特判
如果输入""
,就该输出""
不然会Segmentation Fault
其次,我们可以套双指针的模板
不懂的可以去看 yxc视频
主要思路是:
1.使用vector来存储一个个单词
2.用双指针算法来找到一个个单词
2-1.用快慢指针找出一个单词
2-2.用substr函数截取当前单词段
2-3.将单词段放入vector中
3.反转单词(reverse函数可以实现)
4.将单词用空格拼接起来
接下来,我们将用实战演练来实现我们的算法
让我们开始吧!
实战演练
class Solution {
public:
string reverseWords(string s)
{
if(!s.size()) return "" ; //特判
vector<string> words ; //1 存储单词
for(int i=0,j=0;i<s.size();i=++j) //遍历循环,i为快指针,j为慢指针,i=++j是为了跳出空格,找出下一个单词
{
while(s[j]!=' '&&j<s.size()) j++ ;//2-1 双指针模板,找到单词结尾
words.push_back(s.substr(i,j-i)) ;//2-2&2-3 存入vector
}
reverse(words.begin(),words.end()) ; //3 反转vector
string res ; //答案
for(int i=0;i<words.size()-1;i++)
res+=words[i]+" " ; //4 拼接单词
res+=words[words.size()-1] ;
// 注意,最后一个单词后面没有空格,需要特判
return res ; //返回结果
}
};
算法2(常规操作)$O(n)$
和前面一样,也是双指针。
这种算法更加简单好写
方法是这样的:
1.反转整个单词 (reverse函数实现)//所有单词顺序反转,每个单词本身也反转了 例:abc def 变成 fed cba
2.用双指针算法来找到一个个单词 //让单词本身反转 例:fed cba 变成 def abc 题目解决
2-1.用快慢指针找出一个单词
2-2.反转这个单词段
可参见 这篇优质题解
最后一步的另一种写法:
更加简洁明了