LeetCode 第345题:反转字符串中的元音字母
📖 文章摘要
本文详细解析LeetCode第345题"反转字符串中的元音字母",这是一道简单难度的字符串操作题目。文章提供了双指针解法,包含C#、Python、C++三种语言实现,配有详细的算法分析和性能对比。适合初学算法的程序员学习字符串操作和双指针技巧。
核心知识点: 双指针、字符串、元音字母判断
难度等级: 简单
推荐人群: 初学算法的程序员,想要掌握基本字符串操作的开发者
题目描述
给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 ‘a’、‘e’、‘i’、‘o’、‘u’,且可能以大小写两种形式出现。
示例
示例 1:
输入:s = "hello"
输出:"holle"
示例 2:
输入:s = "leetcode"
输出:"leotcede"
提示
- 1 <= s.length <= 3 * 105
- s 由可打印的 ASCII 字符组成
解题思路
方法:双指针
使用双指针从两端向中间移动,找到元音字母后交换。
关键点:
- 使用HashSet存储元音字母集合
- 左右指针分别从两端开始
- 跳过非元音字母
- 找到元音字母时进行交换
具体步骤:
- 创建元音字母集合
- 初始化左右指针
- 当左指针小于右指针时循环:
- 移动左指针直到找到元音字母
- 移动右指针直到找到元音字母
- 交换两个元音字母
- 移动指针继续查找
时间复杂度:O(n)
空间复杂度:O(1)
图解思路
双指针过程分析表
步骤 | 字符串状态 | left | right | 操作 |
---|---|---|---|---|
初始 | “hello” | 0 | 4 | 找到e和o |
第1步 | “holle” | 1 | 3 | 交换e和o |
第2步 | “holle” | 2 | 2 | 结束 |
元音字母处理示例
输入:"leetcode"
处理过程:
1. left=1(e), right=7(e) -> "leotcode"
2. left=2(e), right=5(o) -> "leotcede"
结果:"leotcede"
代码实现
C# 实现
public class Solution {
private HashSet<char> vowels = new HashSet<char> {
'a', 'e', 'i', 'o', 'u',
'A', 'E', 'I', 'O', 'U'
};
public string ReverseVowels(string s) {
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--;
}
// 交换元音字母
if (left < right) {
char temp = chars[left];
chars[left] = chars[right];
chars[right] = temp;
left++;
right--;
}
}
return new string(chars);
}
}
Python 实现
class Solution:
def reverseVowels(self, s: str) -> str:
vowels = set('aeiouAEIOU')
chars = list(s)
left, right = 0, len(s) - 1
while left < right:
# 找到左边的元音字母
while left < right and chars[left] not in vowels:
left += 1
# 找到右边的元音字母
while left < right and chars[right] not in vowels:
right -= 1
# 交换元音字母
if left < right:
chars[left], chars[right] = chars[right], chars[left]
left += 1
right -= 1
return ''.join(chars)
C++ 实现
class Solution {
public:
string reverseVowels(string s) {
unordered_set<char> vowels = {
'a', 'e', 'i', 'o', 'u',
'A', 'E', 'I', 'O', 'U'
};
int left = 0, right = s.length() - 1;
while (left < right) {
// 找到左边的元音字母
while (left < right && vowels.find(s[left]) == vowels.end()) {
left++;
}
// 找到右边的元音字母
while (left < right && vowels.find(s[right]) == vowels.end()) {
right--;
}
// 交换元音字母
if (left < right) {
swap(s[left], s[right]);
left++;
right--;
}
}
return s;
}
};
执行结果
C# 实现
- 执行用时:80 ms
- 内存消耗:38.4 MB
Python 实现
- 执行用时:44 ms
- 内存消耗:17.2 MB
C++ 实现
- 执行用时:4 ms
- 内存消耗:7.6 MB
性能对比
语言 | 执行用时 | 内存消耗 | 特点 |
---|---|---|---|
C# | 80 ms | 38.4 MB | 代码结构清晰 |
Python | 44 ms | 17.2 MB | 实现简洁 |
C++ | 4 ms | 7.6 MB | 性能最优 |
代码亮点
- 🎯 使用HashSet优化元音字母判断
- 💡 双指针实现高效
- 🔍 边界条件处理完善
- 🎨 代码结构清晰
常见错误分析
- 🚫 忘记考虑大写元音字母
- 🚫 指针移动条件错误
- 🚫 字符串修改方式不当
- 🚫 边界条件处理不当
解法对比
解法 | 时间复杂度 | 空间复杂度 | 优点 | 缺点 |
---|---|---|---|---|
双指针 | O(n) | O(1) | 高效直观 | 无 |
暴力解法 | O(n) | O(n) | 简单 | 空间开销大 |
相关题目
📖 系列导航
🔥 算法专题合集 - 查看完整合集
📢 关注合集更新:点击上方合集链接,关注获取最新题解!目前已更新至第345题。
💬 互动交流
感谢大家耐心阅读到这里!希望这篇题解能够帮助你更好地理解和掌握这道算法题。
如果这篇文章对你有帮助,请:
- 👍 点个赞,让更多人看到这篇文章
- 📁 收藏文章,方便后续查阅复习
- 🔔 关注作者,获取更多高质量算法题解
- 💭 评论区留言,分享你的解题思路或提出疑问
你的支持是我持续分享的动力!
💡 一起进步:算法学习路上不孤单,欢迎一起交流学习!