アナグラムかどうかをハッシュで判定する

2 つの文字列が、文字を並べ替えるだけで同じにできるかを調べる。並べ替えて比べる書き方と、文字の数を数える書き方を比べる練習です。

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

問題

英小文字だけでできた 2 つの文字列 a と b を受け取ります。a の文字の順を並べ替えて b と同じにできるなら true、できないなら false を返す関数を書いてください。

  • 文字を足したり消したりはできません。並べ替えるだけです
  • 同じ文字が何回出るかも、ぴったりそろっている必要があります
  • a と b の長さは、どちらも 0 以上 10000 以下です

入力と出力の例

例 1

a = "below" b = "elbow"
true

例 2

使っている文字の種類は同じでも、数が違えば並べ替えて同じにはできません。

a = "aab" b = "abb"
false

例 3

長さが違えば、それだけで答えは決まります。

a = "note" b = "notes"
false

面接での聞かれ方

面接では、例を添えて短く渡されることが多いです。

  • 「2 つの単語が、文字の並べ替えで同じになるかを判定してください」
  • 書き終えたあとに「いまの書き方の計算量は?」「並べ替えずにできますか?」と続けて聞かれます
  • 「大文字や空白が入ったら?」「日本語なら?」と、入力が広がったときの話を聞かれることもあります

使う文字が英小文字だけなのか、大文字と小文字を同じに見るのかを、最初に確かめておきます。文字の種類が決まると、数え方も選びやすくなります。

ヒント

まだ開いていません

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

  1. ヒント 2

  2. ヒント 3答えに近い

アルゴリズムのチートシートの「ハッシュマップ」に、この型の要点を表とコードでまとめています。

ハッシュは、値から番地を計算して、探す手間をほぼ 1 回にする仕組みです。重複や回数の問題は、この形で解けます。

main.py
def same_letters(a: str, b: str) -> bool:
    """
    Goal: 何を返すか

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

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

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


# 「実行」を押すと、この行の結果が出ます
print(same_letters("below", "elbow"))

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