Leetcode75-345-Reverse-Vowels

🧠 思路总结

可以使用toCharArray()将String转化为char Array形式,因为String是immutable的,转化为char Array的话就可以使用双指针之后对它的vowels出现的地方idx进行调换
每次交换后同时移动两个指针,直到指针相遇为止

❗ 易错点 / 小坑

  • 内层 while 一定要加 left < right,防止指针交叉后仍继续移动或错误 swap
  • 防止left 在内层 while 里被推进到 ≥ right

✅ 代码(Java)

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
/*
* 传统做法
*/
class Solution {
public String reverseVowels(String s) {
StringBuilder sb = new StringBuilder();
String v = "aeiouAEIOU";
Set<Character> vSet = new HashSet<>();
for (int i = 0; i < v.length(); i++){
vSet.add(v.charAt(i));
}
List<Character> vS = new ArrayList<>();
for (int i = 0; i < s.length(); i++){
if (vSet.contains(s.charAt(i))) {
vS.add(s.charAt(i));
}
}
int idx = vS.size() - 1;
for (int i = 0; i < s.length(); i++){
if (vSet.contains(s.charAt(i))){
sb.append(vS.get(idx));
idx--;
} else {
sb.append(s.charAt(i));
}
}
return sb.toString();
}
}
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
/*
* Two Pointers
*/
class Solution {
public String reverseVowels(String s) {
char[] arr = s.toCharArray();
String vowels = "aeiouAEIOU";
// Use two pointers
int left = 0;
int right = arr.length - 1;
while (left < right){
// Move left pointer until it points to a vowel
while (left < right && vowels.indexOf(arr[left]) == -1){
left++;
}
// Move right pointer until it points to a vowel
while (left < right && vowels.indexOf(arr[right]) == -1){
right--;
}
// Swap the vowels
char temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
// Update idx
left++;
right--;
}
return new String(arr);
}
}

Leetcode75-345-Reverse-Vowels
https://powersixxx.github.io/leetcode-blog/2026/01/27/Leetcode75-345-Reverse-Vowels/
作者
Baowen Liu
发布于
2026年1月27日
许可协议