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.递归实现
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
addingpar(res,"",n,0);
return res;
}
void addingpar(vector<string> &v,string str,int n,int m){
//n表示剩余的左括号,m表示需要增加的右括号
if(n==0 && m==0){
v.push_back(str);
return;
}
if(m>0){
addingpar(v,str+")",n,m-1);
}
if(n>0){
addingpar(v,str+"(",n-1,m+1);
}
}
};
开始的时候想着用循环,但是循环没法解决每产生一种新的情况就要保存下来,再在这种新的情况下继续来添加剩余的部分。
于是,递归解决了这个问题,像一个树的形状不断展开。
思考一下递归和循环的区别和各自的用途。
class Solution {
public List<String> generateParenthesis(int n) {
List<String> combinations = new ArrayList();
generateAll(new char[2 * n], 0, combinations);
return combinations;
}
public void generateAll(char[] current, int pos, List<String> result) {
if (pos == current.length) {
//当字符串为所要求的字符串长度,则检查其是否合法
if (valid(current))
result.add(new String(current));
} else {
//两种情况都考虑到,树状展开
current[pos] = '(';
generateAll(current, pos+1, result);
current[pos] = ')';
generateAll(current, pos+1, result);
}
}
public boolean valid(char[] current) {
int balance = 0;
for (char c: current) {
if (c == '(') balance++;
else balance--;
if (balance < 0) return false;
}
return (balance == 0);
}
}
3.最后一种大佬的方法,闭包。
代码照着打下来也不是很明白
class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans=new ArrayList();
if(n==0){
ans.add("");
}
else{
for(int c=0;c<n;++c){
for(String left:generateParenthesis(c))
for(String right:generateParenthesis(n-1-c))
ans.add("("+left+")"+right);
}
}
return ans;
}
}