• 【LeetCode】【动态规划】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——DP

    设:P[i]表示当n=i的时候括号组合串。 观察规律:我们知道,要形成一个括号的组合,肯定不是凭空产生的,产生一个P[3]的组合,那肯定是把"("和")"分别插在P[2]中间的。

    我们假设产生P[3]组合的时候,之前的组合都是正确的,那么通过插入"(",")"肯定会把P[2]分成两个部分(括号内一个,括号外一个)

    看似好像有很多插入的方法,但是,其实仔细想想,反正"("得增加一个,由于括号组合的第一一定是"(",为什么不把新增的"("放在开头呢?这样我们就只用考虑")"了

    会怎么把P[2]切割就好了,我们知道P[2]的组合有P[0]+P[2],P[1]+P[1],P[2]+P[0],

    Alt text

    通过写出前几个可以观察到下面的规律

    P[0]= [""]

    P[1] = [()] = "("+P[0]+")"+P[0]

    P[2] = [()(),(())] = "("+P[0]+")"+P[1] , "("+P[1]+")" +P[0]

    P[3] = [()()(),()(()),(())(),(()()),((()))] = "("+P[0]+")"+P[2] , "("+P[1]+")"+P[1], "("+P[2]+")" +P[0]

    我们可以知道了组合方式:

    • P[i] = "("+P[i-j-1]+")"+P[j]        (j<i,j=0,1,2,......)
    //dp[0] = ""
    //dp[i]='('+ dp[k]+')'+dp[i-1-k],k=0..i-i
    class Solution {
    public:
        vector<string> generateParenthesis(int n) {
            vector< vector<string> > dp(n+1, vector<string>());
            dp[0].push_back("");
            for(int i=1; i<=n; ++i){
                for(int k=0; k<i; ++k){
                    for(string s1: dp[k]){
                        for(string s2: dp[i-1-k])
                            dp[i].push_back("("+s1+")"+s2);
                    }
                }
            }
            return dp[n];
        }
    };

    思路2:回溯

    假设我能枚举所有的情况,我们考虑合理的括号组合是什么样的:

    1. 左括号数==右括号数
    2. 左括号一定要先于右括号

    所以我们可以用一个大数组来表示字符串,2个指针leftpare_need,moreleft来表示左右括号,我们递归遍历所有情况,把满足条件的情况加入list就行了

    class Solution {
    public:
        vector<string> result;
        vector<string> generateParenthesis(int n) {
            helper("", n, 0);
            return result;
        }
    
        /*  this hepler function insert result strings to "vector<string> result"
            When number of '(' less than "n", can append '(';
            When number of '(' is more than number of ')', can append ')';
    
            string s : current string;
            int leftpare_need : number of '(' that have not put into "string s";
            int moreleft : number of '(' minus number of ')' in the "string s";
        */
    
        void helper(string s, int leftpare_need, int moreleft)
        {
            if(leftpare_need == 0 && moreleft == 0)
            {
                result.push_back(s);
                return;
            }
            if(leftpare_need > 0)
                helper(s + "(", leftpare_need - 1, moreleft+1);
            if(moreleft > 0)
                helper(s + ")", leftpare_need, moreleft - 1);
        }
    };
  • 相关阅读:
    url参数中出现+、空格、=、%、&、#等字符的解决办法
    hybrid app、react-native 区别
    native app、web app、hybrid app、react-native 区别
    hybrid app 知识点
    使用过的bug跟踪系统
    移动端点击延迟的解决方案
    Java中的null
    类加载器 知识点
    hashcode 知识点
    stylus 知识点
  • 原文地址:https://www.cnblogs.com/ygh1229/p/9713677.html
Copyright © 2020-2023  润新知