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
删除左边那个 那么s
取s[2:5]
与之对应的逆序s
取s[1:4]
,因为是回文字符串,正 反都要一一对应那么我们删掉的元素也要一一对应,如果我们左边删掉C右边删掉B那么就不符合回文规则。
逆序s取
s[1:4]`,因为是回文字符串,正 反都要一一对应那么我们删掉的元素也要一一对应,如果我们左边删掉C右边删掉B那么就不符合回文规则。
删掉右边同理