186. Reverse Words in a String II

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

Example:

Input:  ["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"]

Note: 

  • A word is defined as a sequence of non-space characters.
  • The input string does not contain leading or trailing spaces.
  • The words are always separated by a single space.

Follow up: Could you do it in-place without allocating extra space?

Rust Solution

struct Solution;

impl Solution {
    fn reverse_words(s: &mut Vec<char>) {
        s.reverse();
        for word in s.split_mut(|&c| c == ' ') {
            word.reverse();
        }
    }
}

#[test]
fn test() {
    let mut s = vec![
        't', 'h', 'e', ' ', 's', 'k', 'y', ' ', 'i', 's', ' ', 'b', 'l', 'u', 'e',
    ];
    let res = vec![
        'b', 'l', 'u', 'e', ' ', 'i', 's', ' ', 's', 'k', 'y', ' ', 't', 'h', 'e',
    ];
    Solution::reverse_words(&mut s);
    assert_eq!(s, res);
}

Having problems with this solution? Click here to submit an issue on github.