# 0186. Reverse Words in a String II

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

## Description

Given a character array `s`, reverse the order of the **words**.

A **word** is defined as a sequence of non-space characters. The **words** in `s` will be separated by a single space.

Your code must solve the problem **in-place,** i.e. without allocating extra space.

**Example 1:**

```
**Input:** s = ["t","h","e"," ","s","k","y"," ","i","s"," ","b","l","u","e"]
**Output:** ["b","l","u","e"," ","i","s"," ","s","k","y"," ","t","h","e"]
```

**Example 2:**

```
**Input:** s = ["a"]
**Output:** ["a"]
```

**Constraints:**

* `1 <= s.length <= 105`
* `s[i]` is an English letter (uppercase or lowercase), digit, or space `' '`.
* There is **at least one** word in `s`.
* `s` does not contain leading or trailing spaces.
* All the words in `s` are guaranteed to be separated by a single space.

## ac

```java
class Solution {
    public void reverseWords(char[] str) {
        // corner cases
        if (str.length < 2) return;

        // reverse whole sentence
        reverse(str, 0, str.length-1);

        // reverse single word, for loop, finally check i to reverse last word
        for (int i = 0, j = 0; i < str.length; i++) {
            if (i+1 == str.length || str[i+1] == ' ') {
                reverse(str, j, i);
                i++;
                j = i + 1;
            }
        }

    }
    private void reverse(char[] str, int start, int end) {
        int s = start, e = end;
        while (s < e) {
            char tmp = str[s];
            str[s] = str[e];
            str[e] = tmp;
            s++;
            e--;
        }
    }
}
```
