https://leetcode.com/problems/reverse-words-in-a-string/?tab=Description
做法1
- 先整体反转
- 再定位到每一个word,做局部反转,同时in-place挪走空格
- 最后pop掉尾巴的空格
Time complexity: O(n)
Space complexity: O(1)
class Solution {
public:
void reverseWords(string &s) {
for (int i = 0, j = s.size() - 1; i < j; i++, j--) {
swap(s[i], s[j]);
}
int next_pos = 0, start = 0, end = 0;
while (start < s.size()) {
while (start < s.size() && s[start] == ' ') start++;
end = start;
while (end < s.size() && s[end] != ' ') end++;
// reverse a word in [start, end - 1]
for (int i = start, j = end - 1; i < j; i++, j--) {
swap(s[i], s[j]);
}
// shift
for (int i = start; i < end; ++i) {
swap(s[i], s[next_pos++]);
}
next_pos++;
start = end;
}
for (int i = s.size() - 1; i >= 0 && s[i] == ' '; --i) {
s.pop_back();
}
}
};
做法2:
思路和做法1一样,只是为了消空格方便,用string流。
Time complexity: O(n)
Space complexity: O(n)
class Solution {
public:
void reverseWords(string &s) {
reverse(s.begin(), s.end());
stringstream ss(s);
string str, ret;
while (ss >> str) {
reverse(str.begin(), str.end());
for (char c : str) {
ret.push_back(c);
}
ret.push_back(' ');
}
if (!ret.empty()) ret.pop_back();
s = ret;
}
};
C语言:
void swap(char *p, char *q)
{
char tmp = *p;
*p = *q;
*q = tmp;
}
void reverseWords(char *s) {
int len = strlen(s);
for (int i = 0, j = len - 1; i < j; i++, j--) {
swap(&s[i], &s[j]);
}
int next_pos = 0, start = 0, end = 0;
while (start < len) {
while (start < len && s[start] == ' ') start++;
end = start;
while (end < len && s[end] != ' ') end++;
// reverse a word in [start, end - 1]
for (int i = start, j = end - 1; i < j; i++, j--) {
swap(&s[i], &s[j]);
}
// shift
for (int i = start; i < end; ++i) {
swap(&s[i], &s[next_pos++]);
}
next_pos++;
start = end;
}
if (next_pos-2 >= 0 && s[next_pos-2] == ' ')
s[next_pos-2] = ' ';
else
s[next_pos-1] = ' ';
}