LeetCode算法题(Go语言实现)_05

打印 上一主题 下一主题

主题 1517|帖子 1517|积分 4551

题目

   给你一个字符串 s ,仅反转字符串中的全部元音字母,并返回效果字符串。
元音字母包括 ‘a’、‘e’、‘i’、‘o’、‘u’,且可能以大小写两种形式出现不止一次。
  一、Go 语言实现

  1. func reverseVowels(s string) string {
  2.     runes := []rune(s)
  3.     vowels := map[rune]bool{'a': true, 'e': true, 'i': true, 'o': true, 'u': true, 'A': true, 'E': true, 'I': true, 'O': true, 'U': true}
  4.     left, right := 0, len(runes)-1
  5.    
  6.     for left < right {
  7.         // 找到左侧的元音
  8.         for left < right && !vowels[runes[left]] {
  9.             left++
  10.         }
  11.         // 找到右侧的元音
  12.         for left < right && !vowels[runes[right]] {
  13.             right--
  14.         }
  15.         // 交换并移动指针
  16.         if left < right {
  17.             runes[left], runes[right] = runes[right], runes[left]
  18.             left++
  19.             right--
  20.         }
  21.     }
  22.     return string(runes)
  23. }
复制代码

二、 算法分析

1. 核心思路

双指针法:使用左右指针从两端向中心扫描,分别找到元音字母后交换。
元音聚集:通过哈希聚集快速判定字符是否为元音(包罗大小写)。
2. 关键步骤


  • 转换字符串为可修改类型:Go 中需将 string 转为 []rune。
  • 初始化双指针:left 从左侧开始,right 从右侧开始。
  • 查找元音并交换
    • 移动 left 直到指向元音。
    • 移动 right 直到指向元音。
    • 若 left < right,交换这两个位置的字符,并继续向中心移动。
  • 返回效果:将 []rune 转回 string。
3. 复杂度

时间复杂度:O(n),每个字符最多被访问两次(左右指针各一次)。
空间复杂度:O(n),存储 []rune 需要额外空间(Go 中字符串不可变)。
三、图解


四、 边界条件与扩展


  • 无元音字符:直接返回原字符串。
  • 全为元音:如 "aeiou" 反转为 "uoiea"。
  • 大小写混合:如 "aA" 交换为 "Aa"。
  • 单字符或无字符:直接返回原字符串。
五、 总结

核心逻辑:双指针法高效定位元音并交换,确保时间复杂度为 O(n)。
大小写处理:通过哈希聚集同一判定大小写元音。
实用场景:雷同“对称交换”或“特定元素重排”问题可参考此思路。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

灌篮少年

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表