LeetCode算法题(Go语言实现)_05
题目给你一个字符串 s ,仅反转字符串中的全部元音字母,并返回效果字符串。
元音字母包括 ‘a’、‘e’、‘i’、‘o’、‘u’,且可能以大小写两种形式出现不止一次。
一、Go 语言实现
func reverseVowels(s string) string {
runes := []rune(s)
vowels := mapbool{'a': true, 'e': true, 'i': true, 'o': true, 'u': true, 'A': true, 'E': true, 'I': true, 'O': true, 'U': true}
left, right := 0, len(runes)-1
for left < right {
// 找到左侧的元音
for left < right && !vowels] {
left++
}
// 找到右侧的元音
for left < right && !vowels] {
right--
}
// 交换并移动指针
if left < right {
runes, runes = runes, runes
left++
right--
}
}
return string(runes)
}
二、 算法分析
1. 核心思路
• 双指针法:使用左右指针从两端向中心扫描,分别找到元音字母后交换。
• 元音聚集:通过哈希聚集快速判定字符是否为元音(包罗大小写)。
2. 关键步骤
[*]转换字符串为可修改类型:Go 中需将 string 转为 []rune。
[*]初始化双指针:left 从左侧开始,right 从右侧开始。
[*]查找元音并交换:
• 移动 left 直到指向元音。
• 移动 right 直到指向元音。
• 若 left < right,交换这两个位置的字符,并继续向中心移动。
[*]返回效果:将 []rune 转回 string。
3. 复杂度
• 时间复杂度:O(n),每个字符最多被访问两次(左右指针各一次)。
• 空间复杂度:O(n),存储 []rune 需要额外空间(Go 中字符串不可变)。
三、图解
https://i-blog.csdnimg.cn/direct/61d30d275da2454bad5a6b1e125b3fc5.png
四、 边界条件与扩展
[*]无元音字符:直接返回原字符串。
[*]全为元音:如 "aeiou" 反转为 "uoiea"。
[*]大小写混合:如 "aA" 交换为 "Aa"。
[*]单字符或无字符:直接返回原字符串。
五、 总结
• 核心逻辑:双指针法高效定位元音并交换,确保时间复杂度为 O(n)。
• 大小写处理:通过哈希聚集同一判定大小写元音。
• 实用场景:雷同“对称交换”或“特定元素重排”问题可参考此思路。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]