Python を使って 2つの文字列がアナグラムかどうかをチェックする
アナグラムは、他の単語の文字を並べ替えることによって形成される単語です。
たとえば、race
と care
、listen
、silent
、fried
と fired
、knee
と keen
は、アナグラムのペアです。しかし、dad
と bad
、apple
と mango
、hello
と world
はアナグラムではありません。
プログラミング言語を使用すると、2つの文字列が互いにアナグラムであるかどうかをすばやく確認できます。
この記事では、2つの文字列がアナグラムであるか Python を使用していないかを確認する方法を示します。同じためのいくつかのアプローチについて説明します。
2つの文字列がアナグラムで Python での並べ替えを使用してあるかどうかを確認する
2つの文字列がアナグラムであるかどうかを確認するために、2つの文字列を並べ替えて、それらが等しいかどうかを確認できます。同じことについては、次のコードを参照してください。
ソートのため、コードの時間計算量は O(nlogn)
であり、値を格納していないため、スペースの複雑さは O(1)
です。
def check_anagram(a, b):
if a is None or b is None or len(a) != len(b):
return "Not Anagram"
return "Anagram" if sorted(a) == sorted(b) else "Not Anagram"
print(check_anagram("keen", "knee"))
print(check_anagram("race", "care"))
print(check_anagram("fried", "fired"))
print(check_anagram("apple", "paddle"))
print(check_anagram("first", "second"))
print(check_anagram(None, "second"))
print(check_anagram("first", None))
print(check_anagram(None, None))
出力:
Anagram
Anagram
Anagram
Not Anagram
Not Anagram
Not Anagram
Not Anagram
Not Anagram
Python で頻度辞書を使用して 2つの文字列がアナグラムであるかどうかを確認する
2つの文字列がアナグラムであるかどうかを確認するために、両方の文字列に存在する文字数を保持し、その数を比較できます。それらが同じである場合、これは 2つの文字列がアナグラムであることを意味します。そうでなければ、そうではありません。
同じことについては、次のコードを参照してください。
次のソリューションの時間計算量は、2つの文字列を反復処理しているため、O(n)
です。辞書に要素を追加して要素を取得する平均時間計算量は O(1)
です。
さらに、同じ数のキーを持つ 2つの辞書を比較するのは O(n)
です。また、2つのディクショナリを維持しているため、スペースの複雑さは O(n)
です。バックグラウンドでは、ディクショナリは配列を使用してキーと値を格納します。
def check_anagram(a, b):
if a is None or b is None or len(a) != len(b):
return "Not Anagram"
counts_a = {}
counts_b = {}
for x in a:
if x not in counts_a.keys():
counts_a[x] = 1
else:
counts_a[x] += 1
for x in b:
if x not in counts_b.keys():
counts_b[x] = 1
else:
counts_b[x] += 1
return "Anagram" if counts_a == counts_b else "Not Anagram"
print(check_anagram("keen", "knee"))
print(check_anagram("race", "care"))
print(check_anagram("fried", "fired"))
print(check_anagram("apple", "paddle"))
print(check_anagram("first", "second"))
print(check_anagram(None, "second"))
print(check_anagram("first", None))
print(check_anagram(None, None))
出力:
Anagram
Anagram
Anagram
Not Anagram
Not Anagram
Not Anagram
Not Anagram
Not Anagram