022括号生成
1 #include "000庫函數.h"
2
3
4
5
6 //使用回溯法,當左括號數量大于右括號數量,則可以放置右括號
7 void recall(vector<string>&bracket, string s, int left, int right) {//bracket使用引用,確保其變化會被保留
8 if (left > right)return;
9 if (left == 0 && right == 0)bracket.push_back(s);
10 else {
11 if (left > 0)recall(bracket, s + '(', left-1, right);
12 if (right > 0)recall(bracket, s + ')', left, right-1);
13 }
14
15 }
16
17 vector<string> generateParenthesis(int n) {
18 vector<string>bracket;
19 if (n < 1)return bracket;
20 recall(bracket, "",n, n);
21 return bracket;
22
23 }
24
25 每找到一個左括號,就在其后面加一個完整的括號,最后再在開頭加一個(),就形成了所有的情況,
26 需要注意的是,有時候會出現重復的情況,所以我們用set數據結構,好處是如果遇到重復項,不會加入到結果中
27 最后我們再把set轉為vector即可
28
29 vector<string> generateParenthesis(int n) {
30 set<string>t;
31 if (n == 0)t.insert("");
32 else {
33 vector<string>pre = generateParenthesis(n - 1);
34 for (auto a : pre) {
35 for (int i = 0; i < a.size(); ++i) {
36 if (a[i] == '(') {
37 a.insert(a.begin() + i + 1, '(');
38 a.insert(a.begin() + i + 2, ')');
39 t.insert(a);
40 a.erase(a.begin() + i + 1, a.begin() + i + 3);
41 }
42 }
43 t.insert("()" + a);
44 }
45
46 }
47 return vector<string>(t.begin(), t.end());//強制類型轉換
48
49 }
50
51
52 void T022() {
53 vector<string>Res;
54 Res = generateParenthesis(3);
55 for (int i = 0; i < Res.size(); ++i)
56 cout << Res[i] << endl;
57
58 }
?
轉載于:https://www.cnblogs.com/zzw1024/p/10501677.html
總結
- 上一篇: Django模板语言(译)
- 下一篇: SpringBoot使用SOFA-Loo