Given an input string, reverse the string word by word.
For example,
Given s = "the sky is blue
",
return "blue is sky the
"
Clarification:
- 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.
使用stack结构存储每一个单词,之后弹出就是逆序排列了。
class Solution {
public:
void reverseWords(string &s) {
stack<string> reverse;
int index=0;
while(s[index]!='\0'){
string temp="";
while(s[index]!='\0'&&s[index]==' '){
index++;
}
while(s[index]!='\0'&&s[index]!=' '){
temp+=s[index];
index++;
}
reverse.push(temp);
}
string result="";
while(!reverse.empty()){
/* string temp=reverse.top();
reverse.pop();
result+=temp;
if(temp!=""&&!reverse.empty()){ //在这里需要注意的是,temp何时为空。只有当末端有一个或多个空格的时候,才会为空。这时候逆转过来就不应该加入字符串,并且最后一个元素后面也不应该加入空格
result+=" ";
<span style="white-space:pre"> </span>}<span style="font-family: Arial, Helvetica, sans-serif;">*/</span>
<span style="white-space:pre"> </span> string temp=reverse.top(); /*换一种方式,在单词前面加空格*/
reverse.pop();
if(!result.empty()){
result+=" ";
}
result+=temp;
}
s=result;
}
};
还有一种方法:
1 从后往前遍历string
2 保存单词,然后需要逆转,在保存到结果中
注意题目中的clarification,处理好其中的空格。
利用了两个额外string保存中间结果。空间复杂度为O(n).
class Solution {
public:
void reverseWords(string &s)
{
string re;
for(int i=s.length()-1;i>=0;){
while(i>=0&&s[i]==' ') i--;
if(i<0) break;
if(!re.empty()){
re.push_back(' ');
}
string temp;
while(i>=0&&s[i]!=' ') temp.push_back(s[i--]);
reverse(temp.begin(),temp.end());
re.append(temp);
}
s=re;
}
};