问题描述:
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。
例如输入字符串"I am a student.",则输出"student. a am I"。
样例
- 输入:“I am a student.”
- 输出:“student. a am I”
常规的想法是建立另一个数组,直接操作两个数组,这样的话会引入额外的空间,另一个思路是使用栈,在这里使用的是分步骤的方法,直接翻转字符串会将所有的单词翻转,那么现在我们遇到空格,将空格前的单词翻转即可,这样一步一步地来即可完成。这道题与leecode上的有不同,如果想要通过Leecode上对应的题目,就需要做一些更改,比如删除字符串前后的空格,删除字符串中两个单词时间多余的空格,如果输入的是全是空格,返回的时候返回空即“”。
class Solution {
public:
string reverseWords(string s) {
reverse(s.begin(),s.end());
for(int i=0;i<s.size();i++)
{
int j=i;
while(j<s.size()&&s[j]!=' ') j++;
reverse(s.begin()+i,s.begin()+j);
i=j;
}
return s;
}
};
使用栈完成本题目。使用双指针运行时间比使用栈的运行时间短。
class Solution {
public:
string reverseWords(string s) {
stack<string> stk;
string res;
for(int i=0;i<s.size();i++)
{
if(s[i]!=' ') res+=s[i];
else
{
stk.push(res);
res="";
}
}
stk.push(res);//记得不要忘记最后一个单词要弹入栈中
string ans;
while(!stk.empty())//不要使用stk.size()作为循环判断条件,因为每次弹出元素栈中的元素个数在变化
{
ans+=stk.top()+" ";
stk.pop();
}
return ans.erase(s.size());
}
};