[leetcode]生成括号


Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
给定n对括号,编写一个函数来生成格式正确的括号的所有组合。

example

For example, given n = 3, a solution set is:

[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

c++代码

对于这种列出所有结果的题首先还是考虑用递归来解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <vector>
#include <iostream>
using namespace std;
class Solution {
public:
vector<string> generateParenthesis(int n) {

vector<string> paren;
backtrack("", paren, n, n);
return paren;
}
void backtrack(string out, vector<string> &paren,int left , int right )
{
if (left > right) return;
if (left==0 && right==0) paren.push_back(out);
else
{
if (left > 0) backtrack(out + "(", paren, left - 1, right);
if (right > 0) backtrack(out + ")", paren, left, right - 1);


}
}

};
int main()
{
Solution s;
s.generateParenthesis(3);
}

算法

左括号3个,右括号3个,所以我们定义两个变量left和right分别表示剩余左右括号的个数,如果在某次递归时,左括号的个数大于右括号的个数,说明此时生成的字符串中右括号的个数大于左括号的个数,即会出现’)(‘这样的非法串,所以这种情况直接返回,不继续处理。如果left和right都为0,则说明此时生成的字符串已有3个左括号和3个右括号,且字符串合法,则存入结果中后返回。如果以上两种情况都不满足,若此时left大于0,则调用递归函数,注意参数的更新,若right大于0,则调用递归函数,同样要更新参数。

注意

分成两个函数来写,因为最终要返回的事一个字符串,但是在迭代过程中,需要范围True或False,所以最好分两个函数,一个函数完成总的框架,范围要的结果,定义迭代的函数。另一个函数就是迭代函数的具体声明。

在声明函数backtrack时,容器paren要用引用,否则,每次退出一个递归,paren里的值将恢复最初的值,无法累计。