JavaScriptで複数の文字列に共通する文字を重複込みで抽出する方法
問題
文字列の配列 arr を第一引数(かつ唯一の引数)として受け取るJavaScript関数を作成することを考えます。
この関数の役割は、配列内のすべての文字列に出現する文字を抽出し、それらを配列として返すことです。重複も含めて扱う必要がある点に注意してください。
たとえば、ある文字がすべての文字列の中で2回ずつ出現している場合(3回ではない場合)、最終的な結果にもその文字を2回だけ含めます。
入力と出力の例
たとえば、関数への入力が次のような場合を考えてみましょう。
const arr = ['door', 'floor', 'crook'];
'r' は3つの文字列すべてに1回ずつ現れ、'o' は 'door' に2回、'floor' に2回、'crook' に2回現れているため、出力は次のようになります。
const output = ['r', 'o', 'o'];
解決策:サンプルコード
以下が実際のコードです。
const arr = ['door', 'floor', 'crook'];
const findCommon = (arr = []) => {
let prev = null;
arr.forEach((str) => {
const next = {};
for(const val of str){
if(!prev){
next[val] = (next[val] || 0) + 1;
}else if(prev[val]){
prev[val] -= 1;
next[val] = (next[val] || 0) + 1;
};
};
prev = next;
});
const res = Object.keys(prev).reduce((acc, val) => {
for(let i = 0; i < prev[val]; i++){
acc.push(val);
}
return acc
}, []);
return res;
};
console.log(findCommon(arr));出力
コンソールには次のように表示されます。
[ 'r', 'o', 'o' ]
アルゴリズムの解説
このコードでは、各文字の「出現回数」をオブジェクトで管理しながら処理を進めます。具体的な流れは次のとおりです。
最初の文字列については、各文字の出現回数をそのままカウントします。2つ目以降の文字列に対しては、前の文字列までで確定した共通カウント(prev)を参照し、その文字がまだ残っている場合にのみカウントを引き継ぎます。これにより、各文字列間で「共通して存在する分だけ」の回数が保持されます。
最後に、reduce() を使ってカウントオブジェクトを配列に展開すれば、重複を含んだ共通文字の配列が完成します。
計算量は文字列の総文字数に比例するため、O(n) の効率で動作し、文字列の数や長さが増えても実用的な速度で処理できます。
-
JavaScriptで配列を空にする方法まとめ【3つの手法と使い分けのポイント】
JavaScriptで配列を空にする(初期化する)方法は複数あります。それぞれの手法には特徴や注意点があり、状況に応じて適切に使い分けることが重要です。この記事では、代表的な3つの方法と、それぞれのメリット・デメリットを詳しく解説します。まず、以下のような配列があると仮定します。let arr = [1, test, {}, 123.43];方法1:新しい空の配列で置き換えるarr = [];変数arrに新しい空の配列を再代入する方法です。最もシンプルかつ高速な手法として知られています。ただし注意点として、元の配列への参照がプログラムの他の場所に存在する場合、それらの参照は自動的に更新されませ
-
JavaScriptの基本配列メソッド解説!push・pop・shift・unshift・spliceの使い方を実例付きで紹介
JavaScriptには、配列を操作するための便利な組み込みメソッドが数多く用意されています。その中でも特によく使われるのが、要素の追加や削除を行う以下の5つの基本メソッドです。 JavaScriptの主要な配列メソッド一覧 メソッド説明 Array.push()配列の末尾に要素を追加します。 Array.pop()配列の末尾から要素を取り除きます。 Array.unshift()配列の先頭に要素を追加します。 Array.shift()配列の先頭から要素を取り除きます。 Array.splice()配列内の任意の位置で要素の追加・削除を行います。 これらのメソッドは、配列の