ツーポインタで回文を判定する

英字と数字だけを見て、大文字と小文字を区別せずに回文かどうかを調べる。両端に置いた 2 つの指を、まん中へ寄せていく考え方 (ツーポインタ) の練習です。

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

問題

文字列 s を受け取ります。s の中の英字と数字だけを見て、前から読んでも後ろから読んでも同じ並び (回文) なら true、そうでなければ false を返す関数を書いてください。

  • 英字の大文字と小文字は区別しません。A と a は同じ文字と見なします
  • 空白や記号など、英字と数字のほかの文字は読み飛ばします
  • 英字と数字が 1 つも無いときは true を返します
  • s の長さは 0 以上 10000 以下で、ASCII の文字 (半角の英字、数字、空白、記号) だけでできています

入力と出力の例

例 1

英字だけを小文字で読むと topspot になり、逆から読んでも同じです。

s = "Top spot!"
true

例 2

1a2 を逆から読むと 2a1 なので、回文ではありません。

s = "1-a-2"
false

例 3

英字も数字も無いので、回文と見なします。

s = "?! .,"
true

面接での聞かれ方

面接では、短い一言で渡されることが多いです。

  • 「文字列が回文かどうかを判定してください。記号は無視して、大文字小文字も区別しません」
  • 書き終えたあとに「余分な記憶を使わずに書けますか?」と続けて聞かれます
  • 「英数字が 1 つも無いときは?」と、端の場合を聞かれることもあります

どの文字を読み飛ばすのか、大文字と小文字を同じに見るのかを、最初に確かめておきます。ここは問題ごとに決まりが違うので、思い込みで書き始めないようにします。

ヒント

まだ開いていません

付箋は 3 枚。下の段ほど答えに近づきます

  1. ヒント 2

  2. ヒント 3答えに近い

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

配列と文字列の問題は、全部の組を調べると手間が大きくなる所を、窓や左右の添字で減らす形が多いです。

main.py
def is_palindrome(s: str) -> bool:
    """
    Goal: 何を返すか

    idea1: まず思いつく案
    -> runtime: O(?)  space: O(?)

    idea2: もっと速い案
    -> runtime: O(?)  space: O(?)

    edge case: 空、1 つだけ、など
    """
    # ここに書きます
    pass


# 「実行」を押すと、この行の結果が出ます
print(is_palindrome("Top spot!"))

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