Given an input string, reverse the string word by word.
For example,
Given s = "the sky is blue
",
return "blue is sky the
".
Update (2015-02-12):
For C programmers: Try to solve it in-place in O(1) space.
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.
这道题是倒序输出字符串中单词,题目难度为Medium。
最直观的想法是将单词逐个存入栈中,然后依次出栈生成倒序后的字符串。具体代码:
class Solution {
public:
void reverseWords(string &s) {
stack<string> words;
string curWord = "";
s += " ";
for(auto ch:s) {
if(ch == ' ') {
if(!curWord.empty()) {
words.push(curWord);
curWord = "";
}
}
else curWord += ch;
}
s = "";
while(!words.empty()) {
s += words.top();
words.pop();
if(!words.empty()) s += " ";
}
}
};
不过题目要求in-place,所以栈不能用了。我们可以先逐个倒序每个单词,然后再将整个字符串倒序,这样也能够得到所求结果,同时保证了in-place。具体代码:
class Solution {
public:
void reverseWords(string &s) {
int idx = 0, pos = 0, len = 0;
while(true) {
while(idx < s.size() && s[idx] == ' ') ++idx;
if(idx == s.size()) break;
if(pos) s[pos++] = ' ';
while(idx < s.size() && s[idx] != ' ') s[pos+(len++)] = s[idx++];
reverse(s.begin()+pos, s.begin()+pos+len);
pos += len;
len = 0;
}
s = s.substr(0, pos);
reverse(s.begin(), s.end());
}
};