JavaScriptで2つの文字列がアナグラムかどうかを判定する方法
アナグラムとは
アナグラム(anagram)とは、一方の文字列に含まれる文字を並べ替えたり組み替えたりすることで、もう一方の文字列とまったく同じ文字列を作り出せる関係を指します。
例えば、「something」と「emosghtin」は互いにアナグラムの関係にあります。
本記事では、2つの文字列 str1 と str2 を受け取り、両者がアナグラムであれば true、そうでなければ false を返すJavaScript関数を実装します。
判定のアプローチ
アナグラムかどうかを効率的に判定するには、次の手順が有効です。
- まず、両者の文字列の長さが異なる場合は、その時点でアナグラムではないと判断できます。
- 次に、各文字列に含まれる文字ごとの出現回数を、オブジェクトを使って集計します。
- 最後に、両方の集計結果を照らし合わせ、すべての文字の出現回数が一致していればアナグラムであると判定します。
サンプルコード
実際のコードは以下の通りです。
const str1 = "something";
const str2 = "emosghtin";
const validAnagram = (str1 = '', str2 = '') => {
let obj1 = {}
let obj2 = {}
if (str1.length !== str2.length){
return false
};
for(let char of str1){
obj1[char] = (obj1[char] || 0) + 1
};
for(let char of str2){
obj2[char] = (obj2[char] || 0) + 1
};
for(let val in obj1){
if(!(val in obj2) || (obj2[val] !== obj1[val])){
return false
}
};
return true;
};
console.log(validAnagram(str1, str2));
実行結果
コンソールには以下のように出力されます。
true
補足:計算量について
この実装では、各文字列を一度ずつ走査して文字の出現回数を記録するため、時間計算量は O(n) となります。そのため、文字列が長くなっても効率よく動作するのが特徴です。また、先に文字数を比較して早期リターンを行うことで、無駄な処理を避けられる点もポイントです。
-
JavaScriptのテンプレート文字列(テンプレートリテラル)とは?基本の使い方を解説
テンプレート文字列(テンプレートリテラル)とは テンプレート文字列は、ES6(ECMAScript 2015)で導入された機能で、文字列の中に式を直接埋め込むことを可能にしました。従来のシングルクォート()やダブルクォート()の代わりに、バッククォート(``)を使用する点が特徴です。 テンプレート文字列を使うと、文字列の連結や補間(インターポレーション)がはるかに直感的に行えます。例えば ${a + b} のように記述することで、文字列の中に任意の式をそのまま埋め込めます。従来のように + 演算子で文字列をつなぎ合わせる方法と比べると、はるかに読みやすく美しい構文です。 JavaScriptに
-
JavaScriptのwithステートメントとは?用途と使い方をわかりやすく解説
JavaScriptのwithステートメントは、特定のプロパティに対してデフォルトのオブジェクトを指定し、冗長になりがちなオブジェクト参照の記述を省略するための構文です。withブロック内で指定したオブジェクトは、スコープチェーンの先頭に追加されるため、そのプロパティ名だけで直接アクセスできるようになります。 基本的な動作 通常、オブジェクトのプロパティにアクセスするには、毎回オブジェクト名を明示する必要があります。しかし、withステートメントを使えば、以下のようにコードを簡潔に書けます。 オブジェクト名の繰り返し記述を省略できる 同じオブジェクトの複数のプロパティへ短くアクセスできる 指