def palindrome(s,index):
if s.islower() and s.isalpha():
num=1
if s[index-num]==s[index+num]:
num+=1
return s[index-num:index+(num+1)]
return s[index]
return ''
我必须返回以指定索引为中心的字符串中最长的奇数长度回文,例如,如果我执行>>>回文(' noonoon&#39),我的Palindrome函数不起作用; 3)我得到了oonoo'而不是' noonoon'
答案 0 :(得分:0)
你需要遍历字符串:
def palindrome(s,index):
if s.islower() and s.isalpha():
num=0
while index > num and index + num + 1 < len(s) and s[index-num-1]==s[index+num+1]:
num+=1
return s[index - num : index + num + 1]
return ''
答案 1 :(得分:0)
def palindrome(s,index):
output=s[index]
for before,after in zip(s[:index][::-1],s[index+1:]):
if before==after:
output=before+output+after
else: break
if output==s[index]: return ''
else: return output
>>> palindrome('youtubecat',3)
'utu'
for
循环从s[index]
向外循环。因此,before
正在循环'uoy'
(you
反转,因此[::-1]
反向拼接)和after
循环遍历'ube'
。虽然before
和after
相同,但会将其附加到s[index]
。只要它们不相同,它就会返回输出。如果无法从index
位置制作回文,则返回empy字符串。
很明显,after
没有循环遍历'ubecat'
,因为当你zip
两个对象的长度必须相同时,这就是为什么它和&#{1}} #39; s被截断为'ube'
。
>>> palindrome('racecar',3)
'racecar'
如果案例不是问题(即'A'='a'
),请使用lower()
声明中的if
方法:
if before.lower()==after.lower()
如果您想要另一种方法:
def palindrome(s,index):
mirror=min([len(s[:index]),len(s[index+1:])])
s=s[index-mirror:index]+s[index:index+mirror+1]
while s:
if len(s)==1: return ''
if s==s[::-1]: return s # check if it's a palindrome
else: # if not, remove the first and last char
s=s[1:-1]