JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

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 を使った方法がおすすめです。

  1. JavaScriptで文字列から重複を除いて一意な文字だけを抽出する方法

    問題JavaScriptで、文字列 str を引数として受け取る関数を作成します。この関数は、入力文字列の中で一度だけ出現する文字(一意な文字)だけで構成される新しい文字列を組み立てて返す必要があります。言い換えると、重複して現れるすべての文字を取り除く処理です。 コード例以下がその実装例です。 { let res = ; for(let i = 0; i < str.length; i++){ const el = str[i]; if(str.indexOf(el) === str.lastIndexOf(el)){

  2. JavaScriptで数値文字列を0と1のビット列にエンコードする方法

    問題 10進数を表す文字列を受け取り、決められたルールに従って「0」と「1」だけで構成される文字列へエンコードするJavaScript関数を実装します。 エンコードのルール 入力文字列の各桁の数字 d に対して、次の手順で符号語を作ります。 d を2進数で表したときのビット数を k とする 「0」を k−1 個並べ、その後ろに「1」を1つ付けた文字列をプレフィックスとする 数字 d 自身を2進数の文字列として表す(最右ビットが最下位ビット) プレフィックスと2進表現を連結したものが d の符号語になる 最後に、すべての桁について得られた符号語を順番に連結したものが、全体のエンコード結果と