JavaScriptで2つの文字列がアナグラムかどうかを判定する方法を解説
プログラミングの学習やコーディング面接でよく出題されるテーマのひとつに「アナグラムの判定」があります。アナグラムとは、同じ文字を並べ替えてできる別の単語や文字列のことです。例えば「listen」と「silent」のように、使用されている文字の種類と数が完全に一致していれば、両者はアナグラムの関係にあると言えます。
この記事では、JavaScriptを使って2つの文字列が互いにアナグラムであるかどうかを判定するプログラムの作成方法を、具体的なコード例とともにわかりやすく解説します。
問題の例
まず、具体的な入力と出力の例を見てみましょう。
例1:アナグラムの場合
入力:
String a = "india" String b = "nidia"
出力:
True
解説:文字列「b」には文字列「a」のすべての文字が含まれているため、Trueを返します。
例2:アナグラムでない場合
入力:
String a = "hackathon" String b = "achcthoon"
出力:
False
解説:文字列「b」には文字列「a」と同じ文字のセットが含まれていないため、Falseを返します。
解決のためのアプローチ
この問題を解くための基本的な考え方は非常にシンプルです。手順は以下の通りです。
- 2つの文字列「a」と「b」を入力として受け取る
- アナグラム判定を行う関数 checkStringsAnagram(a, b) を定義する。アナグラムであればtrue、そうでなければfalseを返す
- まず両方の文字列の長さを取得し、長さが一致しているかどうかを確認する。長さが異なれば、その時点でアナグラムではないと判断できる
- 次に、両方の文字列を文字ごとに分割し、辞書順(アルファベット順)にソートしてから再び結合する
- ソート後の2つの文字列が完全に一致する場合はtrueを、一致しない場合はfalseを返す
この方法のポイントは、アナグラムであれば文字を並べ替えたものにすぎないため、ソートを行えば必ず同じ文字列になるという性質を利用している点です。
コード例
実際のJavaScriptコードは以下のようになります。
function checkStringsAnagram(a, b) {
let len1 = a.length;
let len2 = b.length;
if(len1 !== len2){
console.log('Invalid Input');
return
}
let str1 = a.split('').sort().join('');
let str2 = b.split('').sort().join('');
if(str1 === str2){
console.log("True");
} else {
console.log("False");
}
}
checkStringsAnagram("indian","ndiani")実行結果
上記のコードを実行すると、以下の出力が得られます。
True
文字列「indian」と「ndiani」は同じ文字のセットで構成されているため、両者は互いにアナグラムの関係にあり、結果としてTrueが出力されます。
まとめ
アナグラムの判定は、「長さの比較」と「ソート後の文字列比較」という2つのステップで実現できます。split・sort・joinといったJavaScriptの基本的な配列メソッドを組み合わせるだけで、簡潔に実装できるのが魅力です。計算量はソートに依存し、文字列の長さをnとするとO(n log n)となります。より効率化したい場合は、文字の出現回数をハッシュマップでカウントする方法(O(n))もありますので、興味があればぜひ試してみてください。
-
Pythonで2つの文字列が回転関係にあるかどうかを判定する方法
問題概要2つの文字列 s と t が与えられたとき、t が s を回転(ローテーション)させたものになっているかどうかを判定します。例えば、s = hello、t = llohe の場合、s を左に2文字分回転すると llohe になるため、結果は True となります。解法のアプローチこの問題は「文字列を自分自身と連結する」というシンプルなテクニックで効率的に解くことができます。手順は以下の通りです。s と t の長さが異なる場合、回転関係にはなり得ないので False を返します。temp := s + s として、s を2回連結した文字列を作成します。temp の中に t が含まれている
-
Pythonで2つの数値の指定範囲のビットが互いに補完関係にあるか確認する方法
2つの数値 x と y、および範囲(left, right)が与えられたとき、両方の数値の left 桁目から right 桁目までのビットが互いに補完関係(反転)になっているかどうかを判定する必要があります。なお、ビット位置は右から左へ数え、最下位ビット(LSB)が1桁目として扱われます。例えば、入力が x = 41、y = 54、left = 2、right = 5 の場合、出力は True になります。41 と 54 の2進表現はそれぞれ 101001 と 110110 であり、2桁目から5桁目までのビットは「1001」と「0110」で、互いに補完関係にあるためです。解決のアプローチこの