题目描述
思路解析动画文字版
记住「l 找元音、r 找元音、交换、各进一格」,下面每帧都在套它。
开局:l 指最左、r 指最右。两个指针向中间逼近,各自找元音。
看 l=0 的 'q',不是元音,l 向右移一格继续找。
l=1 的 'u' 是元音(红色),l 停下,等右边也找到元音再交换。
r=11 的 'e' 也是元音(红色)。现在 l、r 两端都停在元音上,可以交换了。
l、r 都停在元音上了('u' 和 'e',红色),把它们交换。
交换完成(绿色):'u' 和 'e' 换了位。l、r 各往里走一格,继续找下一对元音。
l=2 的 'e' 是元音(红色),l 停下,等右边也找到元音再交换。
看 r=10 的 'l',不是元音,r 向左移一格继续找。
看 r=9 的 'b',不是元音,r 向左移一格继续找。
r=8 的 'a' 也是元音(红色)。现在 l、r 两端都停在元音上,可以交换了。
l、r 都停在元音上了('e' 和 'a',红色),把它们交换。
交换完成(绿色):'e' 和 'a' 换了位。l、r 各往里走一格,继续找下一对元音。
看 l=3 的 's',不是元音,l 向右移一格继续找。
看 l=4 的 't',不是元音,l 向右移一格继续找。
l=5 的 'i' 是元音(红色),l 停下,等右边也找到元音再交换。
看 r=7 的 'n',不是元音,r 向左移一格继续找。
r=6 的 'o' 也是元音(红色)。现在 l、r 两端都停在元音上,可以交换了。
l、r 都停在元音上了('i' 和 'o',红色),把它们交换。
交换完成(绿色):'i' 和 'o' 换了位。l、r 各往里走一格,继续找下一对元音。
l 和 r 相遇,所有元音都首尾对称换好了。最终结果:"qeastoineblu"。非元音字符自始至终没动过。
边界先想清:无元音、单元音、大小写混合。
面试常追问与「反转整串」的区别、以及元音的界定。
参考代码
class Solution: def reverseVowels(self, s: str) -> str: vowels = set('aeiouAEIOU') arr = list(s) l, r = 0, len(arr) - 1 while l < r: while l < r and arr[l] not in vowels: l += 1 while l < r and arr[r] not in vowels: r -= 1 arr[l], arr[r] = arr[r], arr[l] l += 1 r -= 1 return ''.join(arr)复杂度
- 时间:O(n),l、r 合计把字符串扫一遍
- 空间:O(1),原地交换(转 char 数组不计)
易错点
面试追问把动画讲成自己的话
追问和「反转整个字符串」有何区别?
追问y 算不算元音?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
判断子序列
LeetCode 392 · 简单 · 沿着 双指针套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题