Reverse Words in a String II

medium string two pointers in-place

Problem

Given a character array s, reverse the order of the words in place. A word is a maximal run of non-space characters; words are separated by a single space and the array contains no leading or trailing spaces.

Inputs = ['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']
Reverse the whole array → "eulb si yks eht", then reverse each word in place → "blue is sky the".

def reverse_words(s):
    def reverse(l, r):
        while l < r:
            s[l], s[r] = s[r], s[l]
            l += 1
            r -= 1
    n = len(s)
    reverse(0, n - 1)
    start = 0
    for i in range(n + 1):
        if i == n or s[i] == " ":
            reverse(start, i - 1)
            start = i + 1
function reverseWords(s) {
  function reverse(l, r) {
    while (l < r) {
      [s[l], s[r]] = [s[r], s[l]];
      l++;
      r--;
    }
  }
  const n = s.length;
  reverse(0, n - 1);
  let start = 0;
  for (let i = 0; i <= n; i++) {
    if (i === n || s[i] === " ") {
      reverse(start, i - 1);
      start = i + 1;
    }
  }
}
class Solution {
    public void reverseWords(char[] s) {
        reverse(s, 0, s.length - 1);
        int start = 0;
        for (int i = 0; i <= s.length; i++) {
            if (i == s.length || s[i] == ' ') {
                reverse(s, start, i - 1);
                start = i + 1;
            }
        }
    }
    private void reverse(char[] s, int l, int r) {
        while (l < r) {
            char tmp = s[l]; s[l] = s[r]; s[r] = tmp;
            l++; r--;
        }
    }
}
void reverseWords(vector<char>& s) {
    auto rev = [&](int l, int r) {
        while (l < r) { swap(s[l], s[r]); l++; r--; }
    };
    int n = s.size();
    rev(0, n - 1);
    int start = 0;
    for (int i = 0; i <= n; i++) {
        if (i == n || s[i] == ' ') {
            rev(start, i - 1);
            start = i + 1;
        }
    }
}
Time: O(n) Space: O(1)