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

JavaScriptでn組の括弧をバランスよく組み合わせる全パターンを生成する方法


問題

数値 n を引数として受け取るJavaScript関数を作成する必要があります。この関数は、n組の丸括弧「(」「)」を正しくバランスさせた文字列のパターンをすべて含む配列を返します。

例えば、n = 3 の場合の出力は次のとおりです。

["()()()","(())()","()(())","(()())","((()))"]

アルゴリズムの考え方

この問題は、再帰呼び出し(バックトラッキング)を使うことで効率的に解くことができます。ポイントは、次の2つの変数で状態を管理することです。

  • left:まだ配置していない開き括弧「(」の残り個数
  • right:現在ペア未確定の開き括弧に対応する、閉じ括弧「)」を配置できる個数

「(」を1つ追加すると left が1減り、代わりに right が1増えます。一方、「)」を追加できるのは right が0より大きい場合だけです。そして、left と right が両方とも0になった時点で、1つの完全なバランス文字列が完成したことになります。

実装例

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

const res = [];
const buildcombination = (left, right, str) => {
    if (left === 0 && right === 0) {
        res.push(str);
    }
    if (left > 0) {
        buildcombination(left-1, right+1, str+"(");
    }
    if (right > 0) {
        buildcombination(left, right-1, str+")");
    }
}
buildcombination(3, 0, "");
console.log(res);

出力結果

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

[ '((()))', '(()())', '(())()', '()(())', '()()()' ]

生成された5つのパターンは、いずれも開き括弧と閉じ括弧の数が等しく、文字列のどの時点を見ても閉じ括弧の数が開き括弧を超えることがない、正しくバランスの取れた文字列になっています。

  1. JavaScriptで変数を定義する3つの方法|let・var・constの違いを徹底解説

    JavaScriptで変数を定義する方法には、「let」「var」「const」の3種類があります。それぞれスコープ(有効範囲)や巻き上げ(ホイスティング)の挙動が異なるため、特徴を理解して適切に使い分けることが重要です。 3つのキーワードの特徴 1. let ― ブロックスコープの変数 2015年(ES2015)に導入されたキーワードで、ブロックスコープを持つ変数を宣言できます。let で宣言された変数は巻き上げの対象とならないため、宣言前にアクセスするとエラーになります。 2. var ― 関数スコープの変数 従来から使われているキーワードで、関数スコープの変数を作成します。var で宣言

  2. JavaScriptで配列を空にする4つの方法【サンプルコード付きで解説】

    JavaScriptで配列を空にする方法は、主に4つあります。それぞれ動作の仕組みや特徴が異なるため、目的に応じて適切な方法を選ぶことが大切です。配列を空にする4つの方法新しい空の配列を代入する:配列変数に、新しく作成した空の配列を代入します。最もシンプルな方法ですが、元の配列を参照している他の変数が残る点には注意が必要です。lengthプロパティを使う:配列のlengthプロパティに0を設定するだけで、すべての要素を削除できます。高速で、元の配列への参照も維持されるため、実務で最もよく使われる方法のひとつです。popメソッドを使う:配列の要素数が0になるまで、popメソッドで末尾の要素を繰り