22. Generate Parentheses

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);
        }
    }
};

开始的时候想着用循环,但是循环没法解决每产生一种新的情况就要保存下来,再在这种新的情况下继续来添加剩余的部分。
于是,递归解决了这个问题,像一个树的形状不断展开。

思考一下递归和循环的区别和各自的用途。


2.暴力算法,先生成所有的情况,再删掉不符合规范的情乱。
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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值