思路
方法一:分割 + 倒序
时间复杂度:O(n),n为s的长度。
1 class Solution { 2 public: 3 string reverseWords(string s) { 4 string t = ""; 5 stack<string> strStack; 6 for(int i = 0; i < s.length(); ++i) { 7 if(s[i] == ' ') { 8 if(t != "") { 9 strStack.push(t); 10 t = ""; 11 } 12 } else { 13 t.push_back(s[i]); 14 } 15 } 16 17 if(t != "") 18 strStack.push(t); 19 20 t = ""; 21 while(!strStack.empty()) { 22 t += strStack.top(); 23 if(strStack.size() > 1) { 24 t.push_back(' '); 25 } 26 27 strStack.pop(); 28 } 29 30 return t; 31 } 32 };
方法二:原地翻转单词顺序
1 class Solution { 2 public: 3 string reverseWords(string s) { 4 // 反转整个字符串 5 reverse(s.begin(), s.end()); 6 7 int n = s.size(); 8 int idx = 0; 9 for (int start = 0; start < n; ++start) { 10 if (s[start] != ' ') { 11 // 填一个空白字符然后将idx移动到下一个单词的开头位置 12 if (idx != 0) s[idx++] = ' '; 13 14 // 循环遍历至单词的末尾 15 int end = start; 16 while (end < n && s[end] != ' ') s[idx++] = s[end++]; 17 18 // 反转整个单词 19 reverse(s.begin() + idx - (end - start), s.begin() + idx); 20 21 // 更新start,去找下一个单词 22 start = end; 23 } 24 } 25 s.erase(s.begin() + idx, s.end()); 26 return s; 27 } 28 };