Problem: 151. 反转字符串中的单词
思路
本题两个个地方非常重要
去除多余空格: 用到 27. 移除元素 的思想 ,用双指针更新数组,但是这里有特殊的地方,单词中间要保留一个空格,所以我们每更新完一个单词后slow
指针就填一个空格
翻转数组,先整体翻转再逐个翻转单词
复杂度
$O(n)$
$O(1)$
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| class Solution { public: void reverse(string& s, int start, int end) { while(start < end) { swap(s[start++],s[end--]); } }
void removeExtraSpaces(string& s) { int slow = 0; for (int i = 0; i < s.size(); ++i) { if (s[i] != ' ') { if (slow != 0) { s[slow] = ' '; slow++; } while (i < s.size() && s[i] != ' ') { s[slow++] = s[i++]; } } } s.resize(slow); }
string reverseWords(string s) { removeExtraSpaces(s); reverse(s, 0, s.size() - 1); int start = 0; for (int i = 0; i <= s.size(); ++i) { if (i == s.size() || s[i] == ' ') { reverse(s, start, i - 1); start = i + 1; } } return s; } };
|