python; checkio日記

checkioを中心にpythonプログラミングの記録

Electric Station 回文問題(The Longest Palindromic)

今回は与えられたテキスト内でもっとも長い回文を探します。

  • 前から一文字ずつ判定
  • 同じ文字で切れるところを探し
  • 反転しても一致するかを調べる

という方向性でやりました。

def longest_palindromic(test):
    ntest =  [(i,test[i]) for i in range(len(test))] # enumerate
    comb=[]
    for i in range(len(test)-1):  
        comb.extend([(test[i:(x+1)],x-i+1) for (x, y) in ntest[i+1:] \
            if (y == test[i] and test[i:(x+1)]==test[i:(x+1)][::-1])])
    if comb == []: # palidromic-negative
        return test[0]
    else:
        return sorted(comb, key=lambda x: x[1], reverse=True)[0][0]

ただ、2個目のステップで同じ文字を探さず、後ろから総当たりで探している人の方が多かった。 この場合、下記のようになる。

def longest_palindromic(test):
    N = len(test)
    for l1 in reversed(range(N)):
        for s1 in range(N - l1):
            text = test[s1:][:l1+1]
            if text == text[::-1]:
                return text

やっぱりこっちのほうがいいですね。。
なお、

test[s1:][:l1+1]

test[s1:s1+l1+1]

よりoperatorの重複を避けられるので好まれるとか。なるほど