leetcode_rust/
reverse_vowels_of_a_string.rs

1#![allow(dead_code)]
2
3// double pointers
4pub fn reverse_vowels(s: String) -> String {
5    if s.len() < 1 {
6        return s;
7    }
8    let mut i = 0;
9    let mut j = s.len() - 1;
10    let mut res = s.into_bytes();
11    while i < j {
12        while i < res.len() && !is_vowel(res[i]) {
13            i += 1;
14        }
15        while j > 0 && !is_vowel(res[j]) {
16            j -= 1;
17        }
18        if i < j {
19            res.swap(i, j);
20            i += 1;
21            j -= 1;
22        }
23    }
24    unsafe { String::from_utf8_unchecked(res) }
25}
26
27// other express method for double pointers
28pub fn reverse_vowels2(s: String) -> String {
29    if s.len() < 1 {
30        return s;
31    }
32    let mut i = 0;
33    let mut j = s.len() - 1;
34    let mut res = s.into_bytes();
35    while i < j {
36        if !is_vowel(res[i]) {
37            i += 1;
38            continue;
39        }
40        if !is_vowel(res[j]) {
41            j -= 1;
42            continue;
43        }
44        if i < j {
45            res.swap(i, j);
46        }
47        i += 1;
48        j -= 1;
49    }
50    unsafe { String::from_utf8_unchecked(res) }
51}
52
53fn is_vowel(c: u8) -> bool {
54    match c {
55        b'a' | b'A' | b'e' | b'E' | b'i' | b'I' | b'o' | b'O' | b'u' | b'U' => true,
56        _ => false,
57    }
58}
59
60#[cfg(test)]
61mod tests {
62    use super::*;
63
64    #[test]
65    fn test1() {
66        assert_eq!(
67            reverse_vowels(String::from("leetcode")),
68            String::from("leotcede")
69        );
70
71        assert_eq!(reverse_vowels(String::from(".")), String::from("."));
72    }
73
74    #[test]
75    fn test2() {
76        assert_eq!(
77            reverse_vowels2(String::from("leetcode")),
78            String::from("leotcede")
79        );
80
81        assert_eq!(reverse_vowels2(String::from(".")), String::from("."));
82    }
83}