获得奇数长度回文

时间:2016-11-07 22:43:51

标签: python palindrome

我正试图找到最长的奇数回文,但我写的代码并没有给我完整的回文,只是它的一部分。任何帮助都会很棒!

def get_odd_palindrome_at(s, index):
    ''' (str, int) -> str

    > get_odd_palindrome_at('tbababt', 3)
    'tbababt'
    > get_odd_palindrome_at('color', 2)
    'olo'
    '''

    palindrome = s[index]
    i = index

    for char in s:
        if s[i - 1] == s[i + 1]:
            palindrome = s[i - 1] + palindrome + s[i + 1]
            i = i + 1

    return palindrome

2 个答案:

答案 0 :(得分:0)

您每次都会移动i,因此您不会将索引扩展到两个方向,而是每次都将您的3个字母圆圈向右移动。您需要保留原始索引,并且每次从原始索引添加或子结构等量增加索引时:

How you want it to be:

c o l o r
  - i -
-   i   -

How it's doing:

c o l o r
  - i -
    - i -

所以实际上只需保存索引,并增加边距。此外,您只想迭代index页边距,而不是字符串,所以:

def get_odd_palindrome_at (s, index):

    palindrome = s[index]

    for i in range(index):
        if s[index - i] == s[index + i]:
            palindrome = s[index - i] + palindrome + s[index + i]
        else:
            break

    return palindrome

答案 1 :(得分:0)

使iindex保持距离,并确保不要超出范围。最后,只有在找到i的最终值时才构建结果字符串。在每次迭代中都没有用:

def get_odd_palindrome_at(s, index):
    for i in range(1, index+1):
        if index + i >= len(s) or s[index - i] != s[index + i]:
            i -= 1
            break

    return s[index-i:index+i+1]

或者,你可以使用两个变量,这简化了代码:

def get_odd_palindrome_at(s, index):
    i = index
    j = index
    while i >= 0 and j < len(s) and s[i] == s[j]:
        i -= 1
        j += 1

    return s[i+1:j]