345.反转字符串中的元音字母
描述
编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
示例
给定 s = “hello”, 返回 “holle”.
给定 s = “leetcode”, 返回 “leotcede”.
元音字母不包括 “y”.
思路:元音字母a,o,i,e,u。首先按序找出字符串中的元音字母,记录下索引值存放在列表index_list中,然后进行倒叙。
我
class Solution:
def reverseVowels(self, s):
"""
:type s: str
:rtype: str
"""
l = ['a','o','e','u','i','A','O','E','U','I']
res = list(s)
index_list = []
for i in range(len(res)):
if res[i] in l:
index_list.append(i)
length = len(index_list)
for j in range(length//2):
res[index_list[j]], res[index_list[-j-1]] = res[index_list[-j-1]], res[index_list[j]]
print(index_list)
return ''.join(res)
看看别人的思路
class Solution:
def reverseVowels(self, s):
"""
:type s: str
:rtype: str
"""
vowels = 'aeiouAEIOU'
# tmps = []
# res = ''
# for i in s:
# if i in vowels:
# tmps.append(i)
# for i in s:
# if i in vowels:
# res += tmps.pop()
# else:
# res += i
# return res
i, j = 0, len(s) - 1
list1 = list(s)
while i < j:
if s[j] not in vowels:
j -= 1
elif s[i] not in vowels:
i += 1
else:
list1[i], list1[j] = list1[j], list1[i]
i += 1
j -= 1
return ''.join(list1)
使用两个指针i和j,分别从头尾便利字符串,当i,j遇到非原音字母时继续遍历,若其中一个遇到元音字母后则在原地等待另一个指针遍历都元音字母,然后两者元素进行交换。继续下一次遍历,直到两个指针相遇停止。思路很好。
还有另外一种思路:首先遍历一边字符串,将元音字母依次入栈。然后将字符串转为列表,遍历列表的时候遇到元音字母则出栈,将栈顶元素赋给当前位置。
class Solution:
def reverseVowels(self, s):
"""
:type s: str
:rtype: str
"""
temp = []
for v in s:
if (v in "aeiouAEIOU"):
temp.append(v)
res = ""
for i in range(len(s)):
if (s[i] in "aeiouAEIOU"):
res += temp.pop()
else:
res += s[i]
return res
算上我的共三种方法,第二种效率最高,第三种次之。