2016-12-31 18 views
-1

皆さん、私はPython 2.7で最も長い回文アルゴリズムの課題に苦労しています。私は近づいていますが、私は理解できない小さな誤りがあります。私が働いて回文を持っていますが、正しい印刷する最長の回文を得ることができない、どちらか私が理解から、私の文字バッファエラーや印刷物0Pythonの最長回文アルゴリズムに固執2.7

def palindrome(string): 
    string = "".join(str.split(" ")).lower() 
    i = 0 
    while i < len(string): 
     if string[i] != string[(len(string) - 1) - i]: 
      return False 

     i += 1 
    return True 
print palindrome("never odd or even") 

def longest_palindrome(string): 
    best_palindrome = 0 
    i1 = 0 
    while i1 < len(string): 
     length = 1 
     while (i1 + length) <= len(string): 
      substring = string.split(i1,length) 
      if palindrome(substring) and (best_palindrome == 0 or len(substring) > len(best_palindrome)): 
       best_palindrome = substring 
      length += 1 
     i1 += 1 
    return best_palindrome 
print longest_palindrome("abcbd") 
+0

あなたがしていることを理解できるように、「最長の回文アルゴリズムの課題」について説明してください。 –

+2

あなたの回文機能は何かナンセンスをしています。 –

+0

@OPが[Manacher's Algorithm](https://en.wikipedia.org/wiki/Longest_palindromic_substring)を実装しようとしていると思います。 – shash678

答えて

1

を与え、あなたの最初の方法は、文字列が回文があるかどうかを確認することでした2番目の方法は最も長い回文を見つけることです。

あなたは関係なく常に

string = "".join(str.split(" ")).lower() 

が空の文字列を返すための入力が何であったかtrueを返しません掲載回文コード。私はあなたにすべてのスペースを削除し、小文字に文字列を作るの所望の効果を与えると考えている

string = string.replace(" ", "").lower() 

にあなたのコードのこの部分を変更しました。

次に、入力された文字列の可能なすべての部分文字列をループし、a)その回文とb)前回の最大回文より長いかどうかを確認する必要があります。

文字列「doloa」の例のようになります。

doloa; is palindrome=false; 

dolo; is palindrome=false; 

dol; is palindrome=false; 

do; is palindrome=false; 

d; is palindrome=true; is bigger than previous large palindrome=true; 

oloa; is palindrome=false; 

olo; is palindrome=true; is bigger than previous large palindrome=true; 

あなたは、文字列全体のために、このループを続けるだろう、と最後に、あなたの変数は「best_palindrome」最大の回文を含める必要があります。

私はあなたのコードを修正しました。これがうまくいくと思います(これがあなたの望む出力であるかどうか教えてください)。

def palindrome(string): 
    comb = string.replace(" ", "").lower() 
    # print(comb) 
    # print(len(comb)) 
    i = 0 
    while i < len(comb): 
     # print(comb[i] + ":" + comb[(len(comb) - 1) - i] + " i: " + str(i) + ", opposite: " + str((len(comb) - 1) - i)) 
     if comb[i] != comb[(len(comb) - 1) - i]: 
     return False 
     i += 1 
    return True 

print palindrome("never odd or even") 

def longest_palindrome(string): 
    best_palindrome = "" 
    i1 = 0 
    while i1 < len(string): 
     length = 0 
     while (i1 + length) <= len(string): 
      substring = string.replace(" ", "").lower() 
      substring = substring[i1:len(substring)-length] 
      #print("Substring: " + str(substring)) 
      if palindrome(substring) and (best_palindrome == "" or len(substring) > len(best_palindrome)): 
       best_palindrome = substring 
      length += 1 
     i1 += 1 
    return best_palindrome 
print longest_palindrome("bgologdds") 

注:私はいくつかの変数の名前を変更し、私はまた、デバッグのためのいくつかの印刷文字列を追加しました。それらを削除するか、将来のデバッグのためにコメントを解除することができます。

+0

完璧に働いてくれてありがとう – Jives

関連する問題