LeetCode问题345:反转字符串中的元音字母

问题345:编写一个函数,以字符串作为输入,反转该字符串中的元音字母。元音字母不包含字母y

这题是反转字符串中的元音字母,也可以用到双指针法,左指针p1和右指针p2分别指向字符串的开头和结尾。

  • 如果p1p2都指向元音字母,则交换两个位置的值,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)

时间复杂度:O(n)
空间复杂度:O(n)

运行结果:

注:
(1)如果不将s转换为列表l,直接处理s,则运行速度会慢很多。因此,如果遇到需要修改字符串中字符的问题,尽量将其转换为列表。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。