【刷题日记】字符串-反转单词-L151-Medium
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
思路
- 用栈存储。遍历完后弹出栈,添加到新字符串并加入空格。
- 双指针法移除空格,之后反转字符串(O(1)空间复杂度)。
代码
栈:
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
| class Solution { public: string reverseWords(string s) { stack<string> st; string tmp = ""; for (int i = 0; i < s.length(); i++) { if (s[i] == ' ') { if (tmp != "") st.push(tmp); tmp = ""; } else tmp += s[i]; } if (tmp != "") st.push(tmp);
string res = ""; while (!st.empty()) { res += st.top(); st.pop(); if (!st.empty()) res += " "; } return res; } };
|
双指针:(O(1)复杂度)
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
| class Solution { public: void reverse(string& s, int start, int end){ for (int i = start, j = end; i < j; i++, j--) { swap(s[i], s[j]); } }
void removeExtraSpaces(string& s) { int slow = 0; for (int i = 0; i < s.size(); ++i) { if (s[i] != ' ') { if (slow != 0) s[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; } };
|