跳转至

151.Reverse Words in a String

Tags: Medium String

Links: https://leetcode.com/problems/reverse-words-in-a-string/


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

Example1:

Input: "the sky is blue"
Output: "blue is sky the"

Example 2:

Input: "  hello world!  "
Output: "world! hello"
Explanation: Your reversed string should not contain leading or trailing spaces.

Example 3:

Input: "a good   example"
Output: "example good a"
Explanation: You need to reduce multiple spaces between two words to a single space in the reversed string.

Note:

  • A word is defined as a sequence of non-space characters.
  • Input string may contain leading or trailing spaces. However, your reversed string should not contain leading or trailing spaces.
  • You need to reduce multiple spaces between two words to a single space in the reversed string.

class Solution {
public:
    string reverseWords(string s) {
        std::ios_base::sync_with_stdio(false);
        cin.tie(NULL);
        cout.tie(NULL);

        int pos = 0;
        int n = s.size(); if (!n) return s;
        //去掉首部的空格
        while (s[pos] == ' ') ++pos;
        s = pos >= n ? "" : s.substr(pos);
        //去掉尾部的空格
        pos = s.size() - 1;
        while (pos > 0 && s[pos] == ' ') --pos;
        s = s.substr(0, pos + 1);

        n = s.size(); if (!n) return s;
        reverse(s.begin(), s.end()); //整体翻转字符串,然后翻转每个单词

        int start = 0, end = 0;
        pos = start;
        while (end < n) {
            start = pos;
            while (end < n && s[end] != ' ') {
                s[pos++] = s[end++];
            }
            if (pos < n) s[pos] = ' ';

            reverse(s.begin() + start, s.begin() + pos); //翻转每个单词
            while (end < n && s[end] == ' ') ++end;
            if (end >= n) break;
            ++pos; //pos指向空格后面的字符
        }

        return s.substr(0, pos);
    }
};

不使用额外存储空间。这里只需要注意一点,28行的程序很重要,因为如果不加,考虑:

a bbb   ccccc
翻转后
ccccc   bbb a

因为第一个循环的end最后会指向空格或者这个字符串的末尾,s[pos++] = s[end++]是去掉单词之间连续的空格,那么pos理应指向空格或者字符串的末尾,如果不加上28行,那么pos指向的是字符b,就少了一个空格。

如果还是无法理解,可以自行模拟检验。