您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# LeetCode如何反转字符串中的元音字母
## 问题描述
[LeetCode 345题](https://leetcode.com/problems/reverse-vowels-of-a-string/)要求我们编写一个函数,反转字符串中的元音字母。具体规则如下:
- 元音字母包括:a, e, i, o, u(大小写都算)
- 需要保持非元音字母的原始位置
- 只反转元音字母的出现顺序
**示例:**
输入: “hello” 输出: “holle”
输入: “leetcode” 输出: “leotcede”
## 解决思路
### 方法一:双指针法
这是最直观高效的解决方案,时间复杂度O(n),空间复杂度O(1)。
```python
def reverseVowels(s: str) -> str:
vowels = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'}
s_list = list(s)
left, right = 0, len(s) - 1
while left < right:
# 找到左边的元音
while left < right and s_list[left] not in vowels:
left += 1
# 找到右边的元音
while left < right and s_list[right] not in vowels:
right -= 1
# 交换元音
s_list[left], s_list[right] = s_list[right], s_list[left]
left += 1
right -= 1
return ''.join(s_list)
另一种思路是先收集所有元音再反转,适合函数式编程爱好者。
def reverseVowels(s: str) -> str:
vowels = [c for c in s if c.lower() in {'a','e','i','o','u'}]
return ''.join(vowels.pop() if c.lower() in {'a','e','i','o','u'} else c for c in s)
初始化:
双指针移动:
交换操作:
方法 | 时间复杂度 | 空间复杂度 |
---|---|---|
双指针法 | O(n) | O(n) |
收集反转法 | O(n) | O(n) |
注:Python中字符串不可变,必须转为列表操作,因此空间复杂度无法优化到O(1)
test_cases = [
("hello", "holle"),
("leetcode", "leotcede"),
("aA", "Aa"),
("xyz", "xyz"),
("", ""),
("a.b,.", "a.b,."),
("aeiou", "uoiea")
]
for input_str, expected in test_cases:
assert reverseVowels(input_str) == expected
遗漏大写元音:
# 错误实现
vowels = {'a','e','i','o','u'} # 漏了大写
指针越界:
while s_list[left] not in vowels: # 缺少left < right条件
字符串不可变:
s[left] = s[right] # Python中会报错
使用集合查找:
vowels = {'a','e','i','o','u','A','E','I','O','U'} # O(1)查找
列表推导式:
[c for c in s if c.lower() in vowels]
public String reverseVowels(String s) {
Set<Character> vowels = new HashSet<>(
Arrays.asList('a','e','i','o','u','A','E','I','O','U'));
char[] chars = s.toCharArray();
int left = 0, right = s.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;
}
return new String(chars);
}
通过这道题目我们学会了: - 双指针法处理字符交换 - 边界条件的全面考虑 - 不同语言的字符串处理差异 - 测试用例的设计方法
建议读者尝试用其他语言实现,并思考如何优化元音判断的效率。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。