Leetcode OJ: Reverse Words in a String

Given an input string, reverse the string word by word.

For example,
Given s = "the sky is blue",
return "blue is sky the".

单词反转,思路就是单词反转后再整句反转,只是加了一些要求,首尾的空格不能要,中间出现连续的空格都变成一个。

 1 class Solution {
 2 public:
 3     void reverseAll(string &s, int i, int j) {
 4         while(i < j) {
 5             if (s[i] != s[j])
 6                 swap(s[i++], s[j--]);
 7             else {
 8                 i++;
 9                 j--;
10             }
11         }
12     }
13     void reverseWords(string &s) {
14         size_t len = s.size();
15         int pre = 0;
16         int i = 0;
17         // 清除开头的空格
18         while (i < len && s[i] == ' ')
19             i++;
20         int begin = i++;
21         int k = 0;
22         // 把中间的空格合并
23         while (i < len) {
24             if (s[i - 1] == ' ' && s[i] == ' ') {
25                 k++;
26             }else if (k > 0) {
27                 s[i - k] = s[i];
28             }
29             ++i;
30         }
31         len -= k;
32         // 清除结尾的空格
33         while (len > begin && s[len - 1] == ' ')
34             len--;
35         pre = begin;
36         
37         // 反转单词
38         for (i = begin; i < len; ++i) {
39             if (s[i] == ' ') {
40                 if (i - 1 > pre)
41                     reverseAll(s, pre, i - 1);
42                 pre = i + 1;
43             }
44         }
45         
46         // 反转最后一个单词
47         if (pre < len - 1)
48             reverseAll(s, pre, len - 1);
49         
50         // 反转整句
51         reverseAll(s, begin, len - 1);
52         if (len < s.size())
53             s.erase(len);
54         if (begin > 0)
55             s.erase(0, begin);
56         
57     }
58 };
 
原文地址:https://www.cnblogs.com/flowerkzj/p/3616531.html