JavaScriptで文字列内の重複(冗長)文字の数を数える方法
本記事では、JavaScriptを使って文字列内に含まれる重複(冗長)文字の個数を求める関数の作成方法を解説します。ここでいう重複文字とは、同じ文字が2回以上出現した際の「繰り返し分」のことを指します。
動作イメージ
たとえば、次のような文字列が与えられた場合を考えてみましょう。
const str = 'abcde';
この場合、すべての文字が一意であるため、出力は 0 となります。
一方、次の文字列の場合:
const str = 'aaacbfsc';
「a」が3回、「c」が2回出現しているため、余分な文字は 3 個となり、これが出力されます。
解決アプローチ:lastIndexOf() を活用する
この問題は、String.prototype.lastIndexOf() メソッドを使うことでシンプルに実装できます。考え方は以下の通りです。
- 文字列を1文字ずつ走査する。
- 各文字について、
lastIndexOf()で取得できる「最後の出現位置」と現在のインデックスを比較する。 - 両者が一致しなければ、同じ文字が後方にも存在することを意味するため、カウンターを増やす。
実装コード
const str = 'aaacbfsc';
const countRedundant = str => {
let count = 0;
for(let i = 0; i < str.length; i++){
if(i === str.lastIndexOf(str[i])){
continue;
};
count++;
};
return count;
};
console.log(countRedundant(str));実行結果
コンソールには次のように出力されます。
3
別解:Set オブジェクトを使ったより簡潔な方法
Set は重複しない値のみを保持するデータ構造です。この性質を利用すると、「文字列の総文字数 − 一意な文字数 = 重複文字数」という計算で、1行で同じ結果を得られます。
const countRedundant = str => str.length - new Set(str).size;
console.log(countRedundant('aaacbfsc')); // 3
console.log(countRedundant('abcde')); // 0この方法なら、コードが短くなるだけでなく、lastIndexOf() を毎回呼び出す方式(計算量 O(n²))と比べて、計算量 O(n) で処理できるため、長い文字列に対しても効率的です。
まとめ
文字列内の重複文字を数えるには、lastIndexOf() を使った逐次比較の方法と、Set のサイズを利用する方法があります。実務では可読性とパフォーマンスの観点から、Set を使った方法がおすすめです。
-
JavaScriptで文字列から重複を除いて一意な文字だけを抽出する方法
問題JavaScriptで、文字列 str を引数として受け取る関数を作成します。この関数は、入力文字列の中で一度だけ出現する文字(一意な文字)だけで構成される新しい文字列を組み立てて返す必要があります。言い換えると、重複して現れるすべての文字を取り除く処理です。 コード例以下がその実装例です。 { let res = ; for(let i = 0; i < str.length; i++){ const el = str[i]; if(str.indexOf(el) === str.lastIndexOf(el)){
-
JavaScriptで数値文字列を0と1のビット列にエンコードする方法
問題 10進数を表す文字列を受け取り、決められたルールに従って「0」と「1」だけで構成される文字列へエンコードするJavaScript関数を実装します。 エンコードのルール 入力文字列の各桁の数字 d に対して、次の手順で符号語を作ります。 d を2進数で表したときのビット数を k とする 「0」を k−1 個並べ、その後ろに「1」を1つ付けた文字列をプレフィックスとする 数字 d 自身を2進数の文字列として表す(最右ビットが最下位ビット) プレフィックスと2進表現を連結したものが d の符号語になる 最後に、すべての桁について得られた符号語を順番に連結したものが、全体のエンコード結果と