当前位置: 首页 > article >正文

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

题目

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

一、Go 语言实现

func reverseVowels(s string) string {
    runes := []rune(s)
    vowels := map[rune]bool{'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[runes[left]] {
            left++
        }
        // 找到右侧的元音
        for left < right && !vowels[runes[right]] {
            right--
        }
        // 交换并移动指针
        if left < right {
            runes[left], runes[right] = runes[right], runes[left]
            left++
            right--
        }
    }
    return string(runes)
}

二、 算法分析

1. 核心思路

双指针法:使用左右指针从两端向中间扫描,分别找到元音字母后交换。
元音集合:通过哈希集合快速判断字符是否为元音(包含大小写)。

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

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

三、图解

在这里插入图片描述

四、 边界条件与扩展

  1. 无元音字符:直接返回原字符串。
  2. 全为元音:如 "aeiou" 反转为 "uoiea"
  3. 大小写混合:如 "aA" 交换为 "Aa"
  4. 单字符或无字符:直接返回原字符串。

五、 总结

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


http://www.kler.cn/a/592187.html

相关文章:

  • Linux--内核进程O(1)调度队列
  • HTML 图像与多媒体元素:拓展学习边界的进度记录(一)
  • LinkedList 底层源码深度解析
  • 【蓝桥杯每日一题】3.17
  • 基于springboot的房屋租赁系统(008)
  • Mysql相关知识:存储引擎、sql执行流程、索引失效
  • AI 大模型统一集成|微服务 + 认证中心:如何保障大模型 API 的安全调用!
  • Elasticsearch 索引
  • 言简意赅 Linux部署elasticsearch7.15.2
  • C语言:编程设计猜数游戏
  • Deflate和Gzip压缩在HTTP响应中的作用与实现
  • NLP高频面试题(六)——decoder-only、encoder-only和encoder-decoder的区别与联系
  • laravel 对 数据库 json 字段的查询方式汇总
  • Post-Training Quantization, PTQ
  • nginx性能优化有哪些方式?
  • Bash 脚本基础
  • numpy学习笔记15:模拟100次随机游走,观察平均行为
  • C++ 语法之函数和函数指针
  • 合约编译部署基本流程
  • Spring(8)——MyBatis入门(2)