22. Generate Parentheses dfs填表

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;
}

 



posted on 2019-03-10 12:35  ZhangのBlog  阅读(182)  评论(0编辑  收藏  举报