题目
力扣
给你一个字符串 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); } }
|