Given an input string, reverse the string word by word.
Example 1:
Input: "the sky is blue"
Output: "blue is sky the"
Example 2:
Input: " hello world! "
Output: "world! hello"
Explanation: Your reversed string should not contain leading or trailing spaces.
Example 3:
Input: "a good example"
Output: "example good a"
Explanation: You need to reduce multiple spaces between two words to a single space in the reversed string.
Note:
- A word is defined as a sequence of non-space characters.
- Input string may contain leading or trailing spaces. However, your reversed string should not contain leading or trailing spaces.
- You need to reduce multiple spaces between two words to a single space in the reversed string.
使用 k 标记当前有效字符的下标(反转后字符与原来字符使用相同空间)的起始位置,t 标记当前有效单词的结束位置的下一个位置; 使用 i 标记原来字符中 第一个不是空格的字符,j表示单词后的第一个空格; 标记了有效字符串的开始和结束,反转单词;每处理完一个单词,有效字符串后都要加上空格。
字符串开始和结束的空格都要处理,逐个单词翻转完成后,到达字符串末尾并清除末尾空格后,翻转整个字符串。
代码如下;
class Solution {
public:
string reverseWords(string s) {
int k = 0;
for(int i = 0; i < s.length(); i++)
{
/* head space */
if(s[i] == ' ') continue;
int j = i, t = k;
while(j < s.length() && s[j] != ' ')
s[t++] = s[j++];
reverse(s.begin() + k,s.begin() + t);
s[t++]= ' ';
k = t, i = j;
}
/* tail space */
if(k) k--;
s.erase(s.begin()+k,s.end());
reverse(s.begin(),s.end());
return s;
}
};