345.反转字符串中的元音字母
题目描述
编写一个函数,以字符串s作为输入,反转该字符串中的元音字母。
示例1
输入:“hello”
输出:“holle”
示例2
输入:“leetcode”
输出:“leotcede”
提示
- 元音字母不包含字母"y"。
思路:暴力、双指针
暴力
从前往后遍历字符串,找到所有元音字母,将元音字母存入一个list,并将字符串元音字母位置改为"+“字符,list反转后,从前往后遍历字符串找到每个”+"字符,对应地将list中的元素替换到字符串中。
class Solution:
def reverseVowels(self, s: str) -> str:
# 暴力解
lst = list(s)
tmp = []
vowels = ['a', 'e', 'i', 'o', 'u']
for i in range(len(lst)):
if lst[i].lower() in vowels:
tmp.append(lst[i])
lst[i] = '+'
tmp.reverse()
cur = 0
for i in range(len(lst)):
if lst[i] == '+':
lst[i] = tmp[cur]
cur += 1
return "".join(lst)
双指针
实际上是对暴力解法的优化,使用双指针分别从左往右和从右往左遍历字符串,找到元音字母交换位置即可。
class Solution:
def reverseVowels(self, s: str) -> str:
# 双指针
vowels = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']
lst = list(s)
l, r = 0, len(lst)-1
while l < r:
if lst[l] in vowels and lst[r] in vowels:
lst[l], lst[r] = lst[r], lst[l]
l += 1
r -= 1
elif lst[l] in vowels:
r -= 1
elif lst[r] in vowels:
l += 1
else:
l += 1
r -= 1
return "".join(lst)