zoukankan      html  css  js  c++  java
  • 【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括号的数量。

  • 相关阅读:
    数据库数据带&符号 导入有问题的处理办法
    JS获得一个对象的所有属性和方法
    escape()、encodeURI()、encodeURIComponent()区别详解
    九度oj 题目1473:二进制数(stack)
    九度oj 题目1066:字符串排序
    九度oj 题目1049:字符串去特定字符
    九度oj 题目1045:百鸡问题
    九度oj 题目1048:判断三角形类型
    九度oj 题目1050:完数
    九度oj 题目1053:互换最大最小数
  • 原文地址:https://www.cnblogs.com/xbf9xbf/p/4536209.html
Copyright © 2011-2022 走看看