Reverse Words in a String
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.
class Solution {
public:
void reversePieceInWord(string &str, int s, int e){
while(s < e){
swap(str[s], str[e]);
s++;
e--;
}
}
void reverseWords(string &str) {
int n = str.size();
int low = 0;
int high = n - 1;
if(n == 0) return;
//全部颠倒
while(low < high){
swap(str[low], str[high]);
++low, --high;
}
int i = 0, j = 0;
//部分颠倒 (单词)
while(i < n){
while(i < n && str[i] == ' ') i++;
j = i;
while(j < n && str[j] != ' ') j++;
reversePieceInWord(str, i, j - 1);
i = j;
}
//去除空格,只留下一个
int flg = 1;
i = 0;
for(j = 0; j < n; j++){
if(flg == 0 && str[j] == ' '){
str[i] = ' ';
i++, flg = 1;
}else if(str[j] != ' '){
str[i] = str[j];
i++, flg = 0;
}
}
//从第i个元素开始pop掉
for(j = n - 1; j >= i; j--){
str.pop_back();
}
//如果flg=1且当前字符串长度为0就要去掉最后那个‘ ’
if(flg == 1 && str.size() > 0) str.pop_back();
}
};