• 【Generate Parentheses】cpp


    题目:

    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:
            vector<string> generateParenthesis(int n)
            {
                vector<string> ret;
                vector<char> tmp;
                Solution::dfs(ret, tmp, 0, n, n, n);
                return ret;
            }
            static void dfs( vector<string>& ret, vector<char>& tmp, int sum, int left, int right, int n )
            {
                if ( left==0 && right==0 )
                {
                    ret.push_back(string(tmp.begin(),tmp.end()));
                    return;
                }
                // '(' or ')'
                if ( left>0 )
                {
                    tmp.push_back('(');
                    Solution::dfs(ret, tmp, sum+1, left-1, right, n);
                    tmp.pop_back();
                }
                if ( right>0 && sum>0 )
                {
                    tmp.push_back(')');
                    Solution::dfs(ret, tmp, sum-1, left, right-1, n);
                    tmp.pop_back();
                }
            }
    
    };

    tips:

    第一反应是不是stack相关的解法,因为感觉跟逆波兰表达式差不多。

    后来发现用‘深搜+剪枝’即可解决。

    这里left表示没有使用的'(',right表示没有使用的')';sum标记使用left和right的情况,使用一次left给sum加1,使用一次right给sum减1。

    能迭代下去的核心条件是:使用的sum必须大于等于0.

    1. 深搜情况,这里每层有两个分支:'(' 或者 ')'

    2. 剪枝条件:

      a) 只要使用过'('小于n, 则可以加到tmp中

      b) 使用过的')'小于n, 并且当前的sum是大于0的

    =======================================

    第二次用dfs过这道题,套路稍微熟悉一些了,考虑dfs的分支顺序:每一层可以加入left括号也可以加入right括号,终止条件的是剩余的left括号数量一定小于right括号的数量。

  • 相关阅读:
    nuc970连接jlink进行单步调试的设置
    alsa utils工具使用
    用arm-linux-gcc v4.3.4交叉编译Qt4.8.3
    LNMP分离式部署
    MHA(下)
    MHA(上)
    PXE自动装机
    JumpServer
    FTP
    DNS
  • 原文地址:https://www.cnblogs.com/xbf9xbf/p/4536209.html
Copyright © 2020-2023  润新知