Given an input string, reverse the string word by word.
For example,
Given s = "the sky is blue
",
return "blue is sky the
".
Clarification:
Solution2:
- What constitutes a word?
A sequence of non-space characters constitutes a word. - Could the input string contain leading or trailing spaces?
Yes. However, your reversed string should not contain leading or trailing spaces. - How about multiple spaces between two words?
Reduce them to a single space in the reversed string
解题思路:
解决1)字符串开头空格问题 2) 字符串之间多空个问题 3) 字符串结尾空格问题
Solution1:使用stringstream(C++串流的输入输出)
#include <sstream.h>
class Solution {
public:
void reverseWords(string &s) {
string st;
vector<string> v;
istringstream stream(s);
int i,count=0;
while(stream>>st)
{
v.push_back(st);
count++;
}
st="";
for(i=1;i<=count;i++)
{
st +=v[count-i];
if(i!=count)
st +=" ";
}
s=st;
}
};
Solution2:
class Solution {
public:
void reverseWords(string &s) {
int count=0;//记数(s中有多少个words)
int i=0;
string temp="";
stack<string> stk;
while(s[i]==' ')i++;//滤过字符串开头空格
for(i;i<s.size();i++)
{
if(s[i]==' '){
if(temp!="")//如果空格前是字符,则将该字符压入堆栈中
{
stk.push(temp);
temp="";
count++;
}
else
;//如果该空格前仍是空格则执行空语句
}
else
{
temp+=s[i];
}
}
if(temp!=""){//当循环推出的时候,判断temp是否有值,有值则添加进栈中
stk.push(temp);
count++;}
s="";
while(count>1)
{
s+=stk.top();
s+=" ";//中间的单词之间填补空格
stk.pop();
count--;
}
if(count==1)
{
s+=stk.top();//最后一个单词不用填补
}
}
};