[LeetCode] Reverse Words in a String

https://leetcode.com/problems/reverse-words-in-a-string/?tab=Description

做法1

  • 先整体反转
  • 再定位到每一个word,做局部反转,同时in-place挪走空格
  • 最后pop掉尾巴的空格

Time complexity: O(n)
Space complexity: O(1)

class Solution {
public:
    void reverseWords(string &s) {
        for (int i = 0, j = s.size() - 1; i < j; i++, j--) {
            swap(s[i], s[j]);
        }

        int next_pos = 0, start = 0, end = 0;
        while (start < s.size()) {
            while (start < s.size() && s[start] == ' ') start++;
            end = start;
            while (end < s.size() && s[end] != ' ') end++;
            // reverse a word in [start, end - 1]
            for (int i = start, j = end - 1; i < j; i++, j--) {
                swap(s[i], s[j]);
            }
            // shift
            for (int i = start; i < end; ++i) {
                swap(s[i], s[next_pos++]);
            }
            next_pos++;
            start = end;
        }
        for (int i = s.size() - 1; i >= 0 && s[i] == ' '; --i) {
            s.pop_back();
        }
    }
};

做法2:

思路和做法1一样,只是为了消空格方便,用string流。

Time complexity: O(n)
Space complexity: O(n)

class Solution {
public:
    void reverseWords(string &s) {
        reverse(s.begin(), s.end());
        
        stringstream ss(s);
        string str, ret;
        while (ss >> str) {
            reverse(str.begin(), str.end());
            for (char c : str) {
                ret.push_back(c);
            }
            ret.push_back(' ');
        }
        if (!ret.empty()) ret.pop_back();
        s = ret;
    }
};

C语言:

void swap(char *p, char *q)
{
    char tmp = *p;
    *p = *q;
    *q = tmp;
}

void reverseWords(char *s) {
    int len = strlen(s);
    
    for (int i = 0, j = len - 1; i < j; i++, j--) {
        swap(&s[i], &s[j]);
    }

    int next_pos = 0, start = 0, end = 0;
    while (start < len) {
        while (start < len && s[start] == ' ') start++;
        end = start;
        while (end < len && s[end] != ' ') end++;
        // reverse a word in [start, end - 1]
        for (int i = start, j = end - 1; i < j; i++, j--) {
            swap(&s[i], &s[j]);
        }
        // shift
        for (int i = start; i < end; ++i) {
            swap(&s[i], &s[next_pos++]);
        }
        next_pos++;
        start = end;
    }
    
    if (next_pos-2 >= 0 && s[next_pos-2] == ' ')
        s[next_pos-2] = '\0';
    else
        s[next_pos-1] = '\0';
}
posted @ 2017-02-25 15:36  mioopoi  阅读(223)  评论(0)    收藏  举报