2016-11-07 7 views
1

Я пытаюсь найти самый длинный палиндром нечетной длины, но код, который я написал, не дает мне полный палиндром, просто его часть. Любая помощь будет замечательной!Получить нечетную длину 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 
+0

Я думаю, что вы хотите 'S [индекс - я] 'и' s [index + i] ', иначе' i = i + 1' всегда перемещает 'i' вправо –

ответ

0

Сделать i расстояние от index и убедитесь, что не цикл вне границ. Наконец, создайте только строку результатов, когда вы найдете окончательное значение 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] 
0

Вы двигаетесь i каждый раз, так что вы не продлевают индекс для обоих направлениях, но переместить 3-х букв-круг вправо каждый раз. Вы должны держать индекс оригинального, и каждый раз добавлять или substruct равного большее количество индекса от индекса в оригинального:

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