算法思想 Day 02

3.反转字符串中的元音字母

编写一个函数,以字符串作为输入,反转该字符串中的元音字母。元音字母[a, e, i, o, u]

思路一:双指针
class Solution:
    def reverseVowels(self, s: str) -> str:
        vowel_dic = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']  # 元音字母表
        s_list = list(s)
        Left_pointer = 0  # 左指针
        Right_pointer = len(s) -1   # 右指针
        while Left_pointer < Right_pointer:  # 当左指针没有与右指针重合时
            if s_list[Left_pointer] in vowel_dic and s_list[Right_pointer] in vowel_dic:  # 两个指针指向的同为元音时
                s_list[Left_pointer], s_list[Right_pointer] = s_list[Right_pointer], s_list[Left_pointer]  # 指向的值互换位置
                Left_pointer += 1  # 左指针向前缩进
                Right_pointer -= 1  # 右指针向后缩进
            else:  # 如果都不在
                if s_list[Left_pointer] not in vowel_dic:
                    Left_pointer += 1  # 左指针向前缩进
                if s_list[Right_pointer] not in vowel_dic:
                    Right_pointer -= 1  # 右指针向后缩进
        return "".join(s_list)  # 将列表变为字符串
思路二:重构元素
class Solution1:
    def reverseVowels(self, s: str) -> str:
        vowel_list = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']
        new_list = []  # 接受修改后的元素
        vowelin_s = [i for i in s if i in vowel_list]  # 在字符串中出现的元音字母
        for i in s:
            if i not in vowel_list:
                new_list.append(i) # 将不是元音的字母按照顺序添加
            else:
                new_list.append(vowelin_s.pop())  # 是元音的话 从字符串中出现的字符从后添加

        return "".join(new_list)

result1 = Solution1()
print(result1.reverseVowels("hello"))

4、验证回文字符

给定一个非空字符串 s最多删除一个字符。判断是否能成为回文字符串

​ 所谓的回文字符串,是指具有左右对称特点的字符串,例如 “abcba” 就是一个回文字符串。

思路一:双指针
class Solution3:
    def validPalindrome(self, s: str) -> bool:
        left = 0  # 左指针
        right = len(s) - 1  # 右指针
        re_s = s[::-1]  # s的逆序字符串
        if s == re_s:  # 正序倒叙都相等  那么他就是回文字符串
            return True
        while left < right:  # 指针缩进
            if s[left] != s[right]:  # 如果两个指针指向的元素不一样  那我们就要尝试着删除其中一个
                # s[left + 1:right+1] 删除左边那个 因为切片不顾尾所以right+1
                # s[left:right] 删除右边那个 切片不顾尾
                return s[left + 1:right+1] == re_s[left:right] or s[left:right] == re_s[left+1:right+1]
            left += 1
            right -= 1
        return True

在这里插入图片描述

删除左边那个 那么ss[2:5]与之对应的逆序ss[1:4],因为是回文字符串,正 反都要一一对应那么我们删掉的元素也要一一对应,如果我们左边删掉C右边删掉B那么就不符合回文规则。

逆序ss[1:4]`,因为是回文字符串,正 反都要一一对应那么我们删掉的元素也要一一对应,如果我们左边删掉C右边删掉B那么就不符合回文规则。

删掉右边同理

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值