2016-11-07 74 views
1

我試圖找到最長的奇數長度迴文,但我寫的代碼並沒有給我完整的迴文,只是它的一部分。任何幫助將是偉大的!獲取奇數長度迴文

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

我想你想單曲[指數 - 我] '和'[index + i]',否則'i = i + 1'總是將'i'移到右邊 –

回答

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] 
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