码迷,mamicode.com
首页 > 其他好文 > 详细

22. Generate Parentheses dfs填表

时间:2019-03-10 13:35:47      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:剪枝   pre   vector   button   code   void   sha   css   ret   

22. Generate Parentheses
Medium

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:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]
思路:
  如果n=1,那么最终结果都是2个符号,如果n=3,最终结果都是6个符号,所以只需要开一个2*n+1的字符数组
枚举左右括号即可,第2*n个字符用于保存‘\0‘(字符串结束标记),这样的时间复杂度是2^n次方。由于这样枚举
出来的结果中有许多不合法,所以可以进行剪枝处理。
    1)第一个位置一定填充左括号
    2)如果当前的右括号个数大于左括号一定是错误的
    3)如果左括号个数大于一半,则一定不合法
#include<iostream>
#include<bits/stdc++.h>
using namespace std;

void solve(vector<string>&ans,int n,int i,int left,int right,char ch[])
{
    if(left>n)
        return;
    if(i == 2*n)
    {
        ans.push_back(ch);
        return;
    }
    ch[i]=(;
    solve(ans,n,i+1,left+1,right,ch);
    if(right<left)
    {
        ch[i]=);
        solve(ans,n,i+1,left,right+1,ch);
    }
}


vector<string> generateParenthesis(int n)
{
    vector<string>ans;
    if(n==0)
        return ans;
    char ch[2*n+1];
    ch[0]=(;
    ch[2*n]=\0;
    solve(ans,n,1,1,0,ch);
    return ans;
}

int main()
{
    vector<string>ans;
    ans=generateParenthesis(1);
    for(int i=0;i<ans.size();i++){
        cout<<ans[i]<<endl;
    }
    return 0;
}

 



22. Generate Parentheses dfs填表

标签:剪枝   pre   vector   button   code   void   sha   css   ret   

原文地址:https://www.cnblogs.com/zhanghaijie/p/10504913.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!