151. 反转字符串中的单词

题目描述

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

解题思路

不能用库函数自己写的话还是有点烦,但是不难

#![allow(unused)]

fn main() {
struct Solution {}

impl Solution {
    // O(1) space O(n) time
    pub fn reverse_words(s: String) -> String {
        let mut v: Vec<char> = vec![];
        for c in s.chars().rev() {
            if c == ' ' {
                let a = v.last();
                if a.is_none() { continue }
                if *a.unwrap() == ' ' { continue }
            }
            v.push(c);
        }
        if v[v.len() - 1] == ' ' { v.pop(); }
        // reverse each word
        let mut start = 0;
        while start < v.len() {
            let mut end = start + 1;
            while end < v.len() && v[end] != ' ' { end += 1 }
            Self::reverse(&mut v[start..end]);
            start = end + 1;
        }
        v.iter().collect()
    }

    pub fn reverse(s: &mut [char]) {
        let n = s.len();
        for i in 0..n/2 {
            let tmp = s[i];
            s[i] = s[n-1-i];
            s[n-1-i] = tmp;
        }
    }
}
}

学习感想

#![allow(unused)]

fn main() {
struct Solution {}
impl Solution {
    pub fn reverse_words(s: String) -> String {
        s.split_ascii_whitespace().rev().collect::<Vec<&str>>().join(" ")
        //  ^ String -> &str
        //                   ^ iter  Target=&str           ^ Vec<&str>
    }
}
}