151. 反转字符串中的单词 - 力扣(LeetCode)

给定一个字符串,逐个翻转字符串中的每个单词。

示例 1:
输入: “the sky is blue”
输出: “blue is sky the”

示例 2:
输入: "  hello world!  "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:
输入: “a good   example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

要求使用空间复杂度O(1)的解法


很综合的题

基本思路:

  • 移除多余空格
  • 将整个字符串反转
  • 再将单词回正

移除多余空格

由于字符串成员的地址连续,这里用快慢指针移除空格,但要注意需保留分隔单词的空格
最后重置字符串的大小

1
2
3
4
5
6
7
8
9
10
11
12
13
void deleteExtraSpaces(string& s) {
    int slow = 0, fast = 0, len = s.size();
    while (fast < len) {
        if (s[fast] != ' ') {
            if (slow != 0) s[slow++] = ' ';
            while (fast < len && s[fast] != ' ') {
                s[slow++] = s[fast++];
            }
        }
        fast++;
    }
    s.resize(slow);
}

反转字符

有单独再反转单词的需求,应引入起始下标

1
2
3
4
5
void reverseString(string& s, int start, int end) {
    for (int i = start, j = end; i < j; i++, j--) {
        swap(s[i], s[j]);
    }
}

反转单词

快慢指针找出每个单词的起始下标进行翻转

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
class Solution {
public:
    void reverseString(string& s, int start, int end) {
        for (int i = start, j = end; i < j; i++, j--) {
            swap(s[i], s[j]);
        }
    }
    void deleteExtraSpaces(string& s) {
        int slow = 0, fast = 0, len = s.size();
        while (fast < len) {
            if (s[fast] != ' ') {
                if (slow != 0) s[slow++] = ' ';
                while (fast < len && s[fast] != ' ') {
                    s[slow++] = s[fast++];
                }
            }
            fast++;
        }
        s.resize(slow);
    }
    string reverseWords(string s) {
        deleteExtraSpaces(s);
        int len = s.size();
        reverseString(s, 0 , len - 1);
        int slow = 0, fast = 0;
        while (fast <= len) {
            if (s[fast] == ' ' || fast == len) {
                reverseString(s, slow, fast - 1);
                fast++;
                slow = fast;
            }
            fast++;
        }
        return s;
    }
};