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.
思路:
class Solution {
public:
void reverseWords(string &s) {
int left = 0;
while (left < s.size() && s[left] == ' ') {
s.erase(left, 1);
}
int right = s.size() - 1;
while (right >= 0 && s[right] == ' ') {
s.erase(right, 1);
right = s.size() - 1;
}
eraseMidEmp(s);
int n = s.size();
for (int i = 0; i < n / 2; i++) {
char tmp = s[i];
s[i] = s[n - 1 - i];
s[n - 1 - i] = tmp;
}
cout << s << endl;
int j = 0;
while (j < n) {
int cnt = 0;
while (j + cnt<n && s[j + cnt] != ' ') {
cnt++;
}
if (cnt > 1) {
reverseOneWord(s, j, j + cnt - 1);
j += cnt;
}
else {
j++;
}
}
}
void reverseOneWord(string &s, int start, int end) {
int n = (end - start + 1) / 2;
for (int i = 0; i < n; i++) {
char tmp = s[start + i];
s[start + i] = s[end - i];
s[end - i] = tmp;
}
}
void eraseMidEmp(string &s) {
int i = 0;
while (i + 1 < s.size()) {
if (s[i] == ' '&&s[i + 1] == ' ') {
s.erase(i, 1);
}
else
i++;
}
}
};