# 151. Reverse Words in a String

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

**Example 1:**

```
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.

**Follow up:**

For C programmers, try to solve it *in-place* in *O*(1) extra space.

```cpp
string reverseWords(string s) { // time: O(n); space: O(n)
    istringstream iss(s);
    string buff, res;
    iss >> res;
    while (iss >> buff) {
        res = buff + ' ' +  res;
    }
    if (!res.empty() && res[0] == ' ') res.clear(); // handle corner case such as s = " "
    return res;
}
```

```cpp
string reverseWords(string s) { // time: O(n); space: O(n)
    string res;
    int n = s.length();
    for (int i = 0; i < n; ++i) {
        if (s[i] == ' ') continue;
        int word_start = i;
        while (i < n && s[i] != ' ') {
            ++i;
        }
        // add space if res is not empty
        if (!res.empty()) {
            res = ' ' + res;
        }
        res = s.substr(word_start, i - word_start) + res;
    }
    return res;
}
```

```cpp
// In-Place Algorithm
string reverseWords(string s) { // time: O(n); space: O(1)
    reverse(s.begin(), s.end());
    int n = s.length(), storeIdx = 0;
    for (int i = 0; i < n; ++i) {
        if (s[i] == ' ') continue;
        // add space if res is not empty
        if (storeIdx > 0) s[storeIdx++] = ' ';
        int j = i;
        while (j < n && s[j] != ' ') {
            s[storeIdx++] = s[j++];
        }
        reverse(s.begin() + storeIdx - (j - i), s.begin() + storeIdx);
        i = j;
    }
    s.resize(storeIdx);
    return s;
}
```

{% content-ref url="186.-reverse-words-in-a-string-ii" %}
[186.-reverse-words-in-a-string-ii](https://jimmylin1991.gitbook.io/practice-of-algorithm-problems/string/186.-reverse-words-in-a-string-ii)
{% endcontent-ref %}
