まん中から広げて最も長い回文の部分文字列を探す

文字列の​中で、​前から​読んでも​後ろから​読んでも​同じに​なる、​いちばん長い​ひと​続きの​部分を​返します。​まん中に​ 2 本の​指を​置き、​両側へ​広げて​確かめる​練習です。

海外で定番の問題リスト 4 本のうち 4 本に入っています (Blind 75、NeetCode 150、Grind 75、LeetCode Top Interview 150)

問題

文字列 s を受け取ります。s のひと続きの部分 (部分文字列) のうち、前から読んでも後ろから読んでも同じになる (回文になる) もので、いちばん長いものを返す関数を書いてください。

  • いちばん長い回文が同じ長さで複数あるときは、いちばん左から始まるものを返します
  • 1 文字だけの部分も回文です。なので、答えは必ず 1 文字以上あります
  • s の長さは 1 以上 1000 以下で、英小文字と数字だけでできています

入力と出力の例

例 1

入力

s = "levelup"

出力

"level"

例 2

"aba" と "cdc" はどちらも 3 文字です。左にある "aba" を返します。

入力

s = "xabacdcy"

出力

"aba"

例 3

長さが偶数の回文は、まん中が 2 文字の間にあります。

入力

s = "zxyyxq"

出力

"xyyx"

面接での聞かれ方

面接では、文字列の問題の中でも、端の場合と添え字の扱いを見るために出されることが多いです。

  • 最初に「部分を全部作って、回文か確かめます」と言うと、「長さ 1000 で間に合いますか?」と聞かれます
  • 書き終えたあとに「長さが偶数の回文も見つかりますか?」と、まん中の取り方を確かめられます
  • 「表 (動的計画法) で書くのと比べて、記憶はどう違いますか?」と、別の書き方との違いを聞かれることもあります

始める位置と終わる位置の 2 つを数えるより、「回文はまん中から左右に同じ文字が続く物」と見直すのが、この問題の芯です。

アルゴリズムのチートシートの「配列と文字列」に、​この​型の​要点を​表と​コードで​まとめています。

main.py
def longest_palindrome(s):
    # ここに書きます
    pass


# 「実行」を押すと、この行の結果が出ます
print(longest_palindrome("levelup"))

できているか「例で確かめる」を押すと、問題の例を全部この関数に渡して、通ったかをここに出します