问题345:编写一个函数,以字符串作为输入,反转该字符串中的元音字母。元音字母不包含字母y
。
这题是反转字符串中的元音字母,也可以用到双指针法,左指针p1
和右指针p2
分别指向字符串的开头和结尾。
- 如果
p1
和p2
都指向元音字母,则交换两个位置的值,p1
向右移动一位,p2
向左移动一位; - 如果
p1
指向的不是元音字母,则p1
向右移动一位; - 如果
p2
指向的不是元音字母,则p2
向左移动一位;
注意,这个方法,除非两个指针都指向元音字母,每一轮循环只改变一个指针,因此不存在漏解。双指针算法非常美妙,根本不需要担心漏解的问题。
完整代码:
class Solution:
def reverseVowels(self, s: str) -> str:
vowel = 'aAeEiIoOuU'
p1, p2 = 0, len(s)-1
l = list(s)
while p2 > p1:
if l[p1] in vowel and l[p2] in vowel:
l[p1], l[p2] = l[p2], l[p1]
p1 += 1
p2 -= 1
elif l[p1] not in vowel:
p1 += 1
else:
p2 -= 1
return ''.join(l)
时间复杂度:
空间复杂度:
运行结果:
注:
(1)如果不将s
转换为列表l
,直接处理s
,则运行速度会慢很多。因此,如果遇到需要修改字符串中字符的问题,尽量将其转换为列表。