leetcode#345-反转字符串中的元音字母

跳出“反转”,其实可以遍历字符串放入新的数组里面来实现反转;善用set来判断重复

题目描述

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

元音字母包括 ‘a’、’e’、’i’、’o’、’u’,且可能以大小写两种形式出现。

示例 1:

输入:s = “hello”
输出:”holle”
示例 2:

输入:s = “leetcode”
输出:”leotcede”

思路

看输出,可以看到前后的元音字母进行了位置交换,可以想到是同时操作两个字符来进行比较,所以用双指针会很方便;

关于反转:其实就是交换前后两个元音字母,是不是可以不交换?可以双向遍历,然后把元素放入一个新的字符数组,然后遇到两个都是元音字母的情况,放的位置变一下即可,就是该往前放的放后面,该往后放的放前面;

关于判断元音字母:可以把元音字母放到set里面,set里面判断是否存在时间复杂度为O(1),方便判断而且高效

代码

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public String reverseVowels(String s) {
HashSet<Character> set = new HashSet<>(Arrays.asList(
'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'));
if (s == null) {
return null;
}
int a = 0;
int b = s.length() - 1;
char[] res = new char[b+1];
while (a <= b) {
char ca = s.charAt(a);
char cb = s.charAt(b);
if (!set.contains(ca)) {
res[a++] = ca;
} else if (!set.contains(cb)) {
res[b--] = cb;
} else {
res[a++] = cb;
res[b--] = ca;
}
}
return new String(res);
}