圆括号组合方式

题目描述

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

猜你喜欢

转载自blog.csdn.net/qq_34360094/article/details/82593697