JavaScriptで2つの文字列に共通する文字数を数える方法
問題の概要
今回は、2つの文字列(str1 と str2)を受け取り、両方の文字列に共通して存在する文字の数を数える JavaScript 関数を作成します。
ここでいう「共通する文字数」とは、同じ文字が両方の文字列に出現する回数を、出現回数の少ない方に合わせてカウントしたものです。
例:
const str1 = 'aabbcc'; const str2 = 'adcaa';
この場合、出力は 3 になります。str1 の 'a' は2つ、str2 の 'a' は3つあるため共通する 'a' は2つ。さらに 'c' は str1 に2つ、str2 に1つあるため共通する 'c' は1つ。合計で 2 + 1 = 3 となります。
実装コード
以下がその実装例です。
const str1 = 'aabbcc';
const str2 = 'adcaa';
const commonCharacterCount = (str1 = '', str2 = '') => {
let count = 0;
str1 = str1.split('');
str2 = str2.split('');
str1.forEach(e => {
if (str2.includes(e)) {
count++;
str2.splice(str2.indexOf(e), 1);
};
});
return count;
};
console.log(commonCharacterCount(str1, str2));出力結果
コンソールには以下のように出力されます。
3
コードの解説
このコードの処理の流れを順番に見ていきましょう。
- カウンタの初期化: 変数 count を 0 で初期化し、共通文字の数を記録します。
- 文字列を配列に変換: split('') を使って、str1 と str2 をそれぞれ1文字ずつの配列に分解します。これにより、各文字を個別に操作できるようになります。
- 共通文字の判定: forEach で str1 の各文字を取り出し、includes() で str2 にその文字が含まれているかを確認します。
- 重複カウントの防止: 文字が見つかった場合は count を1増やし、splice() を使って str2 から該当する文字を1つ削除します。これにより、str2 側の同じ文字を二重にカウントすることを防いでいます。
- 結果の返却: すべての文字をチェックし終えたら、最終的な count を返します。
まとめ
この方法はシンプルで理解しやすいのが特徴です。split・includes・splice といった基本的な配列メソッドを組み合わせるだけで、共通文字数のカウントを実現できます。ただし、文字数が多い場合は計算量が増えるため、パフォーマンスが求められる場面では、オブジェクトや Map を使って各文字の出現回数を先に集計する方法も検討するとよいでしょう。
-
JavaScriptのテンプレート文字列(テンプレートリテラル)とは?基本の使い方を解説
テンプレート文字列(テンプレートリテラル)とは テンプレート文字列は、ES6(ECMAScript 2015)で導入された機能で、文字列の中に式を直接埋め込むことを可能にしました。従来のシングルクォート()やダブルクォート()の代わりに、バッククォート(``)を使用する点が特徴です。 テンプレート文字列を使うと、文字列の連結や補間(インターポレーション)がはるかに直感的に行えます。例えば ${a + b} のように記述することで、文字列の中に任意の式をそのまま埋め込めます。従来のように + 演算子で文字列をつなぎ合わせる方法と比べると、はるかに読みやすく美しい構文です。 JavaScriptに
-
JavaScriptでテンプレート文字列をネストする方法
JavaScriptのES6で導入されたテンプレート文字列(テンプレートリテラル)は、バッククォート(`)で囲むことで文字列の中に変数や式を埋め込める便利な機能です。実は、この${}(プレースホルダー)の中に、さらに別のテンプレート文字列を入れ子(ネスト)として記述することもできます。テンプレート文字列のネストとは${}の中には任意のJavaScript式を書けるため、その中で再度バッククォートを使ったテンプレート文字列を評価することが可能です。これにより、関数呼び出しの引数として動的に生成した文字列を渡すなど、柔軟な文字列組み立てが行えます。コード例以下は、ボタンをクリックすると、ネストされ