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

经典问题——输出n对括号的所有组合

时间:2019-01-20 13:43:08      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:参考   details   https   iostream   多少   amp   包含   .net   target   

问题

n对括号有多少种合法的组合,比如两对括号可以有两种:()()和(())

思路

问题等价为:在一个字符串中包含两种字符:‘(‘和‘)‘,他们出现的次数都为n,并且任何时候‘(‘出现的次数总是大于或等于‘)‘出现的次数。

解决方案:(递归)

n表示括号对数,l表示已有括号个数,r表示已有右括号个数
若r = n,则输出结果
若l < r,不可能
若l = r,则加上左括号
若l > r,分类讨论,若l = n,则全部补充右括号;若l < n,可加左括号或加右括号

代码

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<string>
 4 using namespace std;
 5 
 6 int n;
 7 
 8 void general(int n,int l,int r,int& num,string res)
 9 {
10     if (r == n)
11     {
12         num++;
13         cout << res << endl;
14         return;
15     }
16     if (l == r)
17     {
18         l++;
19         res = res + (;
20         general(n, l, r, num, res);
21     }
22     else
23     {
24         if (l != n)
25         {
26             l++;
27             res = res + (;
28             general(n, l, r, num, res);
29 
30             res.pop_back();
31             l--;
32             r++;
33             res = res + );
34             general(n, l, r, num, res);
35         }
36         else
37         {
38             r++;
39             res = res + );
40             general(n, l, r, num, res);
41         }
42     }
43     return;
44 }
45 
46 int main()
47 {
48     string str;
49     int num;
50     while (scanf("%d",&n) == 1)
51     {
52         num = 0;
53         general(n, 0, 0, num, str);
54         printf("%d\n", num);
55     }
56     return 0;
57 }

 

参考链接:https://blog.csdn.net/u014529413/article/details/39119273

 

经典问题——输出n对括号的所有组合

标签:参考   details   https   iostream   多少   amp   包含   .net   target   

原文地址:https://www.cnblogs.com/lfri/p/10294271.html

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