LeetCode22. Generate Parentheses(C++)

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:

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

方法一:暴力递归生成所有的序列,再加以判断,符合条件的则记录下来

class Solution {
public:
    int len;
    vector<string>result;
    string tempresult="";
    vector<string> generateParenthesis(int n) {
        len=n*2;
        dfs(0);
        return result;
    }
    bool istrue(string s){
        int cnt=0;
        for(int i=0;i<len;i++){
            if(s[i]=='(')
                cnt++;
            else
                cnt--;
            if(cnt<0)
                return false;
        }
        if(cnt==0)
            return true;
        return false;
    }
    void dfs(int index){
        if(index==len){
            if(istrue(tempresult))
                result.push_back(tempresult);
            return;
        }
        tempresult+='(';
        dfs(index+1);
        tempresult.pop_back();
        tempresult+=')';
        dfs(index+1);
        tempresult.pop_back();
    }
};

优化:在递归生成可能序列的时候就进行判断,即剪枝,‘ l ’即为tempresult中尚没有配对的‘(’的数量

class Solution {
public:
    int len,l,x;
    vector<string>result;
    string tempresult="";
    vector<string> generateParenthesis(int n) {
        len=n*2;x=n;
        dfs(0);
        return result;
    }
    void dfs(int index){
        if(l==0&&index==len){
            result.push_back(tempresult);
            return;
        }
        if(l<0||l>x||index==len)
            return;
        tempresult+='('; l++;
        dfs(index+1);
        tempresult.pop_back(); l--;
        tempresult+=')'; l--;
        dfs(index+1);
        tempresult.pop_back(); l++;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_41562704/article/details/86217173