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括号的数量。

  • 相关阅读:
    诸神之眼-Nmap(精版,更新中。。。)
    workerman-chat聊天室
    Mysql记录事本
    网站标题、描述、关键词怎么设置?
    什么是谷歌SEO?
    图片加载之性能优化
    前端实现图片懒加载(lazyload)的两种方式
    HTML`CSS_网站页面不同浏览器兼容性问题解决
    从输入url到显示页面,都经历了什么
    什么是mvvm mvc是什么区别 原理
  • 原文地址:https://www.cnblogs.com/xbf9xbf/p/4536209.html
Copyright © 2011-2022 走看看