题目描述
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
For example, given n = 3, a solution set is:
"((()))", "(()())", "(())()", "()(())", "()()()"
思路:
关键:当前位置左括号数目大于等于右括号数量;
1,若右括号数等于n,说明组合完毕,将该字符串加入字符数组res中;
2,若左括号数小于n,继续添加左括号;
3,若右括号小于左括号数,继续添加右括号;
4,舍弃右括号数大于左括号数的情况;
代码:
递归实现:
import java.util.ArrayList;
public class Solution {
ArrayList<String> res = new ArrayList<String>();
public ArrayList<String> generateParenthesis(int n) {
int left=0,right=0;
String str=new String();
dg(str,left,right,n);
return res;
}
public void dg(String str,int left,int right,int n)
{
if(right==n)
res.add(str);
if(left<n)
dg(str+"(",left+1,right,n);
if(right<left)
dg(str+")",left,right+1,n);
}
}
非递归实现:
链接:https://www.nowcoder.com/questionTerminal/c9addb265cdf4cdd92c092c655d164ca
来源:牛客网
经过分析,发现可以找出来生成表达式。
f(1) = ()
f(2) = (()),()(),
f(3) = ((())),(()()),(())(),()(()),()()(),
f(n) = { f(1)f(n-1) + f(2)f(n-2) + ... + f(n-1)f(n) } + {"(" + f(n-1)) +")" }
代码:
链接:https://www.nowcoder.com/questionTerminal/c9addb265cdf4cdd92c092c655d164ca
来源:牛客网
vector<string> generateParenthesis(int n){
vector<set<string>> res;
res.resize(n+1);
set<string> st;
if(n<=0) return vector<string>();
res[0] = {""};
for(int m=1; m<=n;++m){
// { f(1)f(n-1) + f(2)f(n-2) + ... + f(n-1)f(n) } for(int i=1; i<m;++i){
for(string l: res[i])
for(string r: res[m-i])
res[m].insert(l+r);
}
// {"(" + f(n-1)) +")" }
for(string s: res[m-1]){
res[m].insert(string("(")+s+string(")"));
}
}
vector<string> vec;
for(string s: res[n]){
vec.push_back(s);
}
return vec;
}