【Python】2つの文字列がアナグラムかどうかを判定するプログラム

【Python】2つの文字列がアナグラムかどうかを判定するプログラム

この記事では、Pythonを使って2つの文字列がアナグラムであるかどうかを判定する方法について解説します。 アナグラムとは、2つの文字列が同じ文字を含み、順番が異なる場合を指します。 たとえば、「listen」と「silent」や、「angel」と「glean」などがアナグラムです。

アナグラムとは

アナグラムは、文字列が同じ文字で構成されているが、順番が異なる場合を指します。例えば、以下のペアはすべてアナグラムです。

  • “listen” と “silent”
  • “angel” と “glean”
  • “evil” と “vile”

アナグラム判定は、文字列が同じ文字を含み、各文字が同じ回数だけ現れるかどうかを確認する問題です。

アナグラム判定方法

2つの文字列がアナグラムかどうかを判定する方法にはいくつかの方法がありますが、最も一般的で効率的な方法は以下の2つです。

  • ソートして比較する方法
  • 文字の出現頻度を比較する方法

ソートして比較する方法

ソートして比較する方法は、2つの文字列をそれぞれソートして、ソート後の結果が一致するかどうかを確認する方法です。この方法は実装が簡単で理解しやすいです。

文字の出現頻度を比較する方法

もう1つの方法は、各文字が何回出現するかを数えて、その頻度が一致するかを比較する方法です。この方法は、ソートを使用せずに効率的にアナグラムを判定できます。

Pythonコードでの実装

以下は、Pythonを使って2つの文字列がアナグラムかどうかを判定するプログラムの実装例です。


# ソートして比較する方法
def is_anagram(str1, str2):
    return sorted(str1) == sorted(str2)

# 文字の出現頻度を比較する方法
from collections import Counter

def is_anagram_by_count(str1, str2):
    return Counter(str1) == Counter(str2)

    

上記のコードでは、2つの関数を定義しています。1つ目の関数「is_anagram」は、文字列をソートして比較します。2つ目の関数「is_anagram_by_count」は、collectionsモジュールのCounterを使って文字の出現頻度を比較します。

実行例

上記の関数を使って、いくつかの例を実行してみましょう。


# 実行例1: ソートして比較する方法
print(is_anagram("listen", "silent"))  # True
print(is_anagram("hello", "world"))    # False

# 実行例2: 文字の出現頻度を比較する方法
print(is_anagram_by_count("listen", "silent"))  # True
print(is_anagram_by_count("hello", "world"))    # False

    

実行結果は以下の通りです。

  • 「listen」と「silent」はアナグラムなので、どちらの方法もTrueを返します。
  • 「hello」と「world」はアナグラムではないので、どちらの方法もFalseを返します。

その他の考慮事項

アナグラムを判定する際には、次のような考慮事項もあります。

  • 大文字と小文字の違いを無視する必要がある場合があります。たとえば、「Listen」と「silent」はアナグラムと見なすべきです。
  • 空白や特殊文字を無視する場合もあります。例えば、「a gentleman」と「elegant man」はアナグラムです。

そのため、アナグラム判定を行う前に、文字列を正規化することが重要です。例えば、大文字を小文字に変換したり、空白や特殊文字を取り除いたりする処理を加えることができます。


# 正規化を行ったアナグラム判定
def normalize_string(s):
    return ''.join(e for e in s.lower() if e.isalnum())

def is_anagram_normalized(str1, str2):
    return sorted(normalize_string(str1)) == sorted(normalize_string(str2))

    

この関数では、文字列を小文字に変換し、アルファベットと数字以外の文字を取り除いてから、ソートして比較しています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です