leetcode 22括弧を生成する(再帰的、バックトラック)



Leetcode 22 Generate Parentheses Recursive



nが生成された括弧の対数を表す場合、括弧のすべての可能な効果的な組み合わせを生成できるようにする関数を記述してください。
たとえば、n = 3の場合、生成される結果は次のようになります。
[
'((()))'、
'(()())'、
'(())()'、
'()(())'、
「()()()」
]
考え: nセットの角かっこ、角かっこ文字列の長さは2 * n、文字列の各文字には2つのオプション、「(」または「)」があるため、2 ^ 2nの可能性があります
たとえば、2組の括弧、すべての組み合わせは16種類である可能性がありますが、これらの16の可能性のうち、合法ですか?法的な可能性はいくつありますか?それらを生成する方法は? (再帰的方法を使用すると、構造は次のようになります)
画像
この質問では:
1.左右の角かっこの数はnを超えることはできません
2.左角かっこを入れるたびに、右角かっこを付けることができます。つまり、右角かっこを左角かっこより前に置くことはできません。

したがって、再帰を制限する必要があります。
1.左角かっこと右角かっこの数(最大n)
2.左角かっこ数の場合<= the number of right brackets, recursion to place the right brackets is not allowed

コードは次のとおりです。

class Solution { public: vector<string> generateParenthesis(int n) { vector<string> result generate('', n, n, result) return result } private: //item is the generated string, left can currently place the number of left brackets, right is currently the number of right brackets void generate(string item, int left, int right, vector<string> &result){ if(left == 0 && right == 0){ result.push_back(item) return } if(left > 0){ generate(item + '(', left - 1, right, result) } if(left < right){ generate(item + ')', left, right - 1, result) } } }

入力:3
出力:['((()))'、 '(()())'、 '(())()'、 '()(())'、 '()()()']