[炼手Rust]翻转元音

122 阅读1分钟

Hi,大家好,这里是炼手Rust专栏,我是xiaoK,今天来看一个小case:翻转元音。

Vowels.png

提问

给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。

元音字母包括 'a''e''i''o''u''A''E''I''O''U'

例:
input:"hello"
output:"holle"

input:leetcode
output:leotcede

模板:

pub fn reverse_vowels(s: String) -> String {
}

分析

按照题设,我们只需要从两头找,找到第一对元音字母进行交换,然后向中间收缩,持续这个过程,就能完成该题。

解决方案

pub fn reverse_vowels(s: String) -> String {

    let mut chars: Vec<char> = s.chars().collect();

    let mut i = 0;
    let mut j = chars.len() - 1;

    while i < j {

        if !matches!(chars[i],'a' | 'e' | 'i' | 'o' | 'u' | 'A' | 'E' | 'I' | 'O' | 'U') {
            i += 1;
            continue;
        }

        if !matches!(chars[j],'a' | 'e' | 'i' | 'o' | 'u' | 'A' | 'E' | 'I' | 'O' | 'U') {
            j -= 1;
            continue;
        }

        chars.swap(i,j);

        i += 1;
        j -= 1;
    }

    String::from_iter(chars)
}

Tick

  1. String类型转换成char数组,需要使用s.chars().collect()
  2. char数组转换成String,使用String::from_iter(chars)
  3. match表达式,有个宏定义matches!,返回表达式的匹配结果true or false