示例:
输入:‘hello’
输出:‘holle'
class Solution:
def reverseVowels(self, s: str) -> str:
# assert type(s)==str
start,end=0,len(s)-1
s=list(s)
target_list= ['a','e','i','o','u']
while start<end:
if s[start] not in target_list:
start+=1
elif s[end] not in target_list:
end-=1
else:
mid=s[start]
s[start]=s[end]
s[end]=mid
return ''.join(str(s))
我当时一开始写成这样的思路是,我想它要找出字符串里的元音字母,那么我首先要定义元音字母的元素列表,然后让指针指向的字符到元素列表里找是否符合元音的规则,然后借助中间变量进行前后位置调换;如果start位置的字符不是元音则往后找;如果end位置的字符不是元音往前找,最后再将列表转回字符串输出;
但是这里代码存在几大问题:
当然官方给出的判断思路是
首先 start 和 end同时在元音list里面,互换,并移动指针即start+=1;end-=1
其次 start 在元音list里面,end-=1
还有 end 在元音list里面,start+=1
其余情况,start+=1;end-=1
我感觉应该是官方给的比较全面一点吧从思路上哈哈
然后正确的代码是:
class Solution:
def reverseVowels(self,s:str)->str:
if len(s)<1:
return s
s=list(s)
start,end=0,len(s)-1
vowels=set('aeiouAEIOW')
while start<end:
if s[start] in vowels and s[end] in vowels:
s[start],s[end]=s[end],s[start]
start+=1
end-=1
elif s[start] in vowels:
end-=1
elif s[end] in vowels:
start+=1
else:
start+=1
end-=1
return ''.join(s)
测试用例
def reverseVowels(s):
if len(s)<1:
return s
s=list(s)
start,end=0,len(s)-1
vowels=set('aeiouAEIOU')
while start<end:
if s[start] in vowels and s[end] in vowels:
s[start],s[end]=s[end],s[start]
start+=1
end-=1
elif s[start] in vowels:
end-=1
elif s[end] in vowels:
start+=1
else:
start+=1
end-=1
return ''.join(s)
print(reverseVowels('hello'))
然后我把我的思路改正后的代码提交了
class Solution:
def reverseVowels(self, s: str) -> str:
if len(s)<1:
return s
s=list(s)
start,end=0,len(s)-1
target_list=list('aeiouAEIOU')
while start<end:
if s[start] not in target_list:
start+=1
elif s[end] not in target_list:
end-=1
else:
s[start],s[end]=s[end],s[start]
start+=1
end-=1
return ''.join(s)
提交结果发现竟然比官方的思路要快一点,如图,第二个是我的
说明我判断的思路应该没有大问题,不过官方的结题思路更严谨,值得学习。