剑指 Offer 58

思路

方法一:分割 + 倒序

时间复杂度: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 };

参考

力扣官方题解 - 翻转字符串里的单词

相似题目

剑指 Offer 58 - II. 左旋转字符串

原文地址:https://www.cnblogs.com/FengZeng666/p/13972453.html