题目描述
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。
示例 1:
输入: “the sky is blue”
输出: “blue is sky the”
示例 2:
输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
算法思想
方法一:利用栈的先进后出特性,将字符依次压入栈中,再依次弹出,此时便能实现题目要求。
方法二:从后面往前面依次排除空格,此时可以使按要求实现。
代码实现
class Solution {
public:
string reverseWords(string s) {
//方法一 栈
// stack<string> ans;
// string tmp="";
// for(auto x:s){
// if(x==' '){
// //去除多余空格
// if(tmp!=""){
// ans.push(tmp);
// }
// tmp="";
// continue;
// }
// tmp+=x;
// }
// while(!ans.empty()){
// if(tmp!=""){
// tmp+=" ";
// }
// tmp+=ans.top();
// ans.pop();
// }
// return tmp;
//方法二 从后往前排除空格
if(s.empty())
return s;
string ret = "";
int i = s.size() - 1;
while(i >= 0)
{
while(i >= 0 && s[i] == ' ')
--i;
int j = i;
while(i >=0 && s[i] != ' ')
--i;
if(i < j)
{
ret += s.substr(i + 1,j - i);
ret += " ";
}
}
return ret.substr(0,ret.size() - 1);
}
};