目录
题目描述:
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
解题思路:
回溯法。搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。括号生成规律:
搜索树,左节点插入左括号,右节点插入右节点,根据请下面情况。
1)右括号等于n,即对数n时,即找到一对;
2)左括号小于n,可以添加左括号;
3)左括号大于右括号个数,可以添加右括号。
符合上述规律生成的树如下,结合代码看,括号内是(string cur, vector<string> &res, int n, int left, int right):
以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
c++代码
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
string cur_str = "";
search(cur_str, res, n, 0, 0);
return res;
}
// 引用,记录所有结果
void search(string cur_str, vector<string>& res, int n, int left, int right)
{
// 先左括号,后右括号,right是右括号,数量=n 表明此时已经找到一个结果
// 当前节点合适,如上图的第4个节点,right==n==2
if (right == n)
{
res.push_back(cur_str);
return; // 如上图的第4个节点,找到合适的了,就不用遍历它左右节点了
}
// 左节点,看是否添加左括号
if (left < n) search(cur_str+'(', res, n, left+1, right);
// 右节点,看是否添加右括号
if (left > right) search(cur_str+')', res, n, left, right+1);
}
};
python代码
class Solution(object):
def search(self, cur_str, res, n, left, right):
# 当前节点合适, 符合的条件是右节点使用完了,即right == n
if right == n:
res.append(cur_str)
return
# 左节点,是否可以插入
if left < n:
self.search(cur_str + "(", res, n, left+1, right)
# 右节点
if left > right:
self.search(cur_str + ")", res, n, left, right+1)
def generateParenthesis(self, n):
"""
:type n: int
:rtype: List[str]
"""
res = []
cur_str = ""
self.search(cur_str, res, n, 0, 0)
return res