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

JavaScriptで文字列の全組み合わせを生成する関数の書き方

今回は、文字列を唯一の引数として受け取り、その文字を組み合わせて作れるすべてのパターンを配列として返すJavaScript関数の作り方を解説します。たとえば「Delhi」という文字列が渡されれば、「D」「De」「Deh」…「Delhi」のように、各文字を選ぶ・選ばないを組み合わせた全31通りの文字列が生成されます。

仕組みのポイント

この実装の核となるのはビット演算です。まず文字列を1文字ずつに分解して配列に格納し、0から 2n−1(nは文字数)までの整数を順に走査します。各整数を2進数のビットパターンとみなし、ビットが立っている位置に対応する文字だけを連結することで、重複なくすべての組み合わせを網羅できます。

処理の流れ

1. substring()を使って文字列を1文字ずつの配列に変換する
2. 組み合わせの総数(2の文字数乗)分だけ外側のループを回す
3. 内側のループでビットが立っている文字のみを連結し、空文字列でなければ結果配列へ追加する

サンプルコード

以下が実際のコードです。

const str = 'Delhi';
const allCombinations = (str1 = '') => {
    const arr = [];
    for (let x = 0, y = 1; x < str1.length; x++, y++) {
        arr[x] = str1.substring(x, y);
    }
    const combination = [];
    let temp = "";
    const len = Math.pow(2, arr.length);
    for (let i = 0; i < len; i++) {
        temp = "";
        for (let j = 0; j < arr.length; j++) {
            if (i & Math.pow(2, j)) {
                temp += arr[j];
            }
        }
        if (temp !== "") {
            combination.push(temp);
        }
    }
    return combination;
};
console.log(allCombinations(str));

出力結果

コンソールには以下のように出力されます。

[
    'D', 'e', 'De', 'l',
    'Dl', 'el', 'Del', 'h',
    'Dh', 'eh', 'Deh', 'lh',
    'Dlh', 'elh', 'Delh', 'i',
    'Di', 'ei', 'Dei', 'li',
    'Dli', 'eli', 'Deli', 'hi',
    'Dhi', 'ehi', 'Dehi', 'lhi',
    'Dlhi', 'elhi', 'Delhi'
]

5文字の文字列の場合は 25 − 1 = 31通りとなります。上記の出力を見ると、単一文字から完全な文字列「Delhi」まで、すべての組み合わせが漏れなく生成できていることが確認できます。

  1. JavaScriptで文字列内のすべての回文部分列を数える方法【動的計画法】

    回文(パリンドローム)とは? 回文(パリンドローム)とは、前から読んでも後ろから読んでも同じになる文字列のことです。例えば、「aba」「madam」「did」などは、いずれも正しい回文の例です。 問題の概要 今回作成するのは、文字列を引数として受け取り、その中に含まれるすべての回文部分列(連続しているかどうかを問わない)の総数を数えて返すJavaScript関数です。 なお、入力として与えられる文字列は「a」「b」「c」「d」の4種類の文字のみで構成されていることが保証されています。 入出力の例 たとえば、入力文字列が次の通りだったとします。 const str = bccb; この場合の出

  2. JavaScriptで文字列のすべての一意な順列(重複なし)を生成する方法

    問題引数として文字列 str を受け取るJavaScript関数を作成します。この関数は、入力文字列から作り出せるすべての順列を生成し、重複が存在する場合はそれらを取り除いて返す必要があります。つまり、入力文字列に含まれる文字を、考えられるあらゆる順序で並べ替えた結果の中から、一意なものだけを求めるということです。例えば、入力が aabb のように同じ文字を含む場合、単純に全並べ替えを行うと同一の文字列が何度も現れますが、本記事の関数では aabb、abab、abba のような一意な組み合わせのみを出力します。コード例以下が実際のコードです。const str = aabb; const pe