LeetCode 345. 反转字符串中的元音字母
题目描述
思路分析
解法一:双指针(推荐)
核心思路:
- 左右指针分别寻找元音字母。
- 当左右同时指向元音时交换并继续向中间移动。
- 其他字符直接跳过。
复杂度分析:
- 时间复杂度:O(n),其中 n 表示字符串长度。
- 空间复杂度:O(n),使用字符数组便于交换。
import java.util.HashSet;
import java.util.Set;
class Solution {
public String reverseVowels(String s) {
Set<Character> vowels = new HashSet<>();
for (char c : new char[]{'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'}) {
vowels.add(c);
}
char[] chars = s.toCharArray();
int left = 0;
int right = chars.length - 1;
while (left < right) {
while (left < right && !vowels.contains(chars[left])) {
left++;
}
while (left < right && !vowels.contains(chars[right])) {
right--;
}
char temp = chars[left];
chars[left] = chars[right];
chars[right] = temp;
left++;
right--;
}
return new String(chars);
}
}
func reverseVowels(s string) string {
vowels := map[byte]struct{}{
'a': {}, 'e': {}, 'i': {}, 'o': {}, 'u': {},
'A': {}, 'E': {}, 'I': {}, 'O': {}, 'U': {},
}
chars := []byte(s)
left, right := 0, len(chars)-1
for left < right {
for left < right {
if _, ok := vowels[chars[left]]; ok {
break
}
left++
}
for left < right {
if _, ok := vowels[chars[right]]; ok {
break
}
right--
}
chars[left], chars[right] = chars[right], chars[left]
left++
right--
}
return string(chars)
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 344. 反转字符串 | 简单 | 双指针 |
| 541. 反转字符串 II | 简单 | 双指针 |
| 557. 反转字符串中的单词 III | 简单 | 字符串 |
| 125. 验证回文串 | 简单 | 双指针 |
| 151. 反转字符串里的单词 | 中等 | 字符串 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!
