一. 题目
n表示生成括号的对数,请写一个函数,输入n,产生所有可能且有效的括号组合
例如 n=3 生成结果:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
二. 思路:
目标:求出所有由n对圆括号组合的有效形式,考虑用递归的方法生成所有可能的组合形式,关键:如何保证使用递归算法生成的组合形式是合法的
分析:1. n对括号(包含n个left括号 n个right括号)2. 两个限制条件:(1)左右括号数相等 (2)在任意位置之前的右括号不大于左括号数;
步骤:1. 取string str 保存生成结果, int left 为剩余要插入的左括号数, int right 为剩余要插入的右括号数
2. left ==0 且 right ==0 说明已生成一个由n对圆括号组合的有效形式,将其存入结果中即可
3. 若left!=0那么插入左括号就是合法的;若right!=0且right>left(即当前剩余需要插入的右括号树大于剩余左括号树,那么插入右括号也是合法的!)。
void generate(vector<string> &result, string str, int left, int right)
{
if (left == 0 && right == 0)
{
result.push_back(str);
}
else
{
if (left != 0)
generate(result, str + "(", left - 1, right);
if (right > left)
generate(result, str + ")", left, right - 1);
}
}
C++版
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> result;
generate(n, n, "", result);
return result;
}
void generate(int leftNums, int rightNums, string s, vector<string>& result){
if (leftNums == 0 && rightNums == 0) result.push_back(s);
if (leftNums > 0){
generate(leftNums - 1, rightNums, s + "(", result);
}
if (leftNums < rightNums && rightNums > 0){
generate(leftNums, rightNums - 1, s + ")", result);
}
}
};
python版
class Solution:
def generateParenthesis(self, n):
"""
:type n: int
:rtype: List[str]
"""
self.res= []
self.generateParenthesisIter('',n,n)
return self.res
def generateParenthesisIter(self,mstr,r,l):
if r==0 and l==0:
self.res.append(mstr)
#如果左括号的个数还有剩余,则+’(‘然后递归
if l>0:
self.generateParenthesisIter(mstr+'(',r,l-1)
#如果右括号有剩余且小于左括号的个数则+‘)’
if r>0 and r>l:
self.generateParenthesisIter(mstr+')',r-1,l)
三. reference
c++ 思路 https://blog.csdn.net/alexlau8/article/details/72803010?locationNum=7&fps=1
python code https://blog.csdn.net/qq_36791003/article/details/81317740