反转字符串中的元音字母

题目

力扣

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

元音字母包括 'a''e''i''o''u',且可能以大小写两种形式出现不止一次。

示例

示例 1:

1
2
输入:s = "hello"
输出:"holle"

示例 2:

1
2
输入:s = "leetcode"
输出:"leotcede"

题解

使用双指针,一个指针从头向尾遍历,一个指针从尾到头遍历,当两个指针都遍历到元音字符时,交换这两个元音字符。

为了快速判断一个字符是不是元音字符,我们将全部元音字符添加到集合 HashSet 中,从而以 O(1) 的时间复杂度进行该操作。

  • 时间复杂度为 O(N):只需要遍历所有元素一次
  • 空间复杂度 O(1):只需要使用两个额外变量

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class ReverseVowels {

//定义元音字符集合
private static final HashSet<Character> chars = new HashSet<>(
Arrays.asList('a','e','i','o','u','A','E','I','O','U'));
public static void main(String[] args) {
System.out.println(reverseVowels("leetcode"));
}

public static String reverseVowels(String s){
if (s == null){
return null;
}
int i = 0;
int j = s.length() - 1;
//结果字符串
char[] result = new char[s.length()];
while (i <= j){
//双指针
char le = s.charAt(i);
char ri = s.charAt(j);
if (!chars.contains(le)){
//左指针不包含右移
result[i++] = le;
}else if (!chars.contains(ri)){
//右指针不包含左移
//双指针同时判断
result[j--] = ri;
}else {
//左右符合,交换位置
result[i++] = ri;
result[j--] = le;
}
}
return new String(result);
}
}

反转字符串中的元音字母
https://tomysmith.top/reverse-vowels/
作者
Plua Htims
发布于
2023年11月28日
许可协议