在索引处返回回文 - Python

时间:2016-11-10 22:45:20

标签: python-3.x

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'

2 个答案:

答案 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'。虽然beforeafter相同,但会将其附加到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]