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

Posted lfri

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典问题——输出n对括号的所有组合相关的知识,希望对你有一定的参考价值。

问题

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
", num);
55     }
56     return 0;
57 }

 

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

 

以上是关于经典问题——输出n对括号的所有组合的主要内容,如果未能解决你的问题,请参考以下文章

9.9递归和动态规划——打印n对括号的所有有效组合(即左右括号正确配对)

算法打印N对合理括号组合

c_cpp 给定n对括号,编写一个函数来生成格式正确的括号的所有组合。例如,给定n = 3,解决方案

ybt1317 组合方案(dfs经典例题)超硬核

python 题目:斐波那契数列计算;题目:站队顺序输出;题目:合法括号组合的生成;题目:用户登录(三次机会)

Python - 所有组合,包括括号