leetcode题库——括号生成

版权声明: https://blog.csdn.net/Dorothy_Xue/article/details/83385312

题目描述:

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 n = 3,生成结果为:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

方法:DFS+剪枝

class Solution {
public:
    int numl=1;
    int numr=0;
    string str="(";
    int deep=1;
    vector<string> s;
    vector<string> ans;
    vector<string> generateParenthesis(int n) 
    {   
        if(n==1)
        {
            ans.push_back("()");
            return ans;
        }
        int num=n;
        s.push_back("(");
        for(int i=1;i<n;i++)
            s.push_back("()");
        dfs(numl,numr,str,n,num);
        return ans;
    }  
    void dfs(int numl,int numr,string str,int n,int num)
    {
        if(deep<2*n-1)
        {
            for(int i=0;i<2;i++)
            {
                if(numl>=numr&&numl<=num)
                {
                    if(i==0) dfs(numl+1,numr,str+s[deep].substr(i,1),deep+1,num);
                    if(i==1) dfs(numl,numr+1,str+s[deep].substr(i,1),deep+1,num);
                }
                else continue;
            }
        }
        if(numl==num&&numr==num) ans.push_back(str);
    }    
};

思路:

首先,将n对括号对应的“搜索树” 建立出来,例如:n=3时,建立一个vector<string>s,s=['(','()','()','()','()','()'],这样,对应的搜索树就是这样:

深搜时,设置两个计数器,分别记录左括号和右括号的数量,当i=0时,左括号+1;i=1时,右括号+1。当左括号数量大于3或者左括号数量大于右括号时,进行剪枝(也就是不继续往下搜索了,回溯到上一个递归中继续搜索)。

猜你喜欢

转载自blog.csdn.net/Dorothy_Xue/article/details/83385312