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の重複を避けられるので好まれるとか。なるほど