# [151. Reverse Words in a String](https://leetcode.com/problems/reverse-words-in-a-string/)
# 思路
翻转字符串中的单词，题目中给了我们写特别说明，如果单词之间遇到多个空格，只能返回一个，而且首尾不能有单词.

## 思路一
我们新建一个初始化为空的结果字符串res, 从后往前遍历字符串s将每个单词不断拼接到res的尾部就可以了.

## 思路二
题目还要求对使用C的同学满足O(1)的复杂度, 那我们就只能在s上进行修改了.

我们先整个字符串整体翻转一次，然后再分别翻转每一个单词，此时就能得到我们需要的结果了。

# C++
## 思路一
``` C++
class Solution {
public:
    string reverseWords(string s) {
        string res = "";
        int low, high = s.size() - 1;
        while(high >= 0){
            while(high >= 0 && s[high] == ' ') high--;
            if(high < 0) return res;
            low = high - 1;
            while(low >= 0 && s[low] != ' ') low--;
            
            if(res != "") res += " ";
            res += s.substr(low+1, high - low);
            high = low - 1;
        }
        return res;
    }
};
```

## 思路二
``` C++
class Solution {
public:
    string reverseWords(string s) {
        reverse(s.begin(), s.end());
        int len = 0; // 结果字符串的长度
        for(int i = 0; i < s.size(); i++){
            if(s[i] != ' '){
                if(len != 0) s[len++] = ' ';
                int j = i;
                while(j < s.size() && s[j] != ' ') s[len++] = s[j++];
                reverse(s.begin() + len - (j - i), s.begin() + len);
                i = j;
            }
        }
        s.resize(len); // 修改字符串长度
        return s;
    }
};
```
