Problem P17. [算法课回溯]括号生成
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
有效括号组合需满足:左括号必须以正确的顺序闭合。
提示:
1 <= n <= 8
请按照括号生成的层数有大到小排序,如输入3时,先生成((())),最后再生成 ()()()
输入
输入数字n
输出
生成所有可能的并且 有效的 括号组合
样例
标准输入
3
标准输出
[((())), (()()), (())(), ()(()), ()()()]
标准输入
1
标准输出
[()]
解题思路:参考文章1,参考文章2
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
vector<string> strs;//容器strs储存括号
void dfs(int left, int right, string curstr)//深度优先,左右括号剩下个数,当前括号形式
{
//递归函数先写结束语句
if(left==0 && right==0)
{
strs.push_back(curstr);//把当前ok的括号形式push_back进容器strs中;
return;//此时返回值是void,不需要return 0;
}
if(left<=right && left>=0)//左括号剩下数量必须小于右括号剩下数量,左括号必须大于0;
{
dfs(left-1, right, curstr+"(");//放左括号,左括号数量-1;
dfs(left, right-1, curstr+")");//放右括号,右括号数量-1;
}
}
int main()
{
int n;//输入括号数量;
cin >> n;
dfs(n, n, "");
cout << "[";
for(int i=0; i<strs.size(); i++)//输出容器strs中的括号形式
{
cout << strs[i];
if(i != strs.size()-1)
{
cout << ", ";//输出逗号来间隔括号形式;
}
}
cout << "]";
// cout << "Hello world!" << endl;
return 0;
}
二刷
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
/*
思路:深度回溯递归算法,三个参数,左括号剩余数,右括号剩余数,当前组合的括号形式
括号剩余数都为0则终止;
左括号剩余数量必须少于右括号剩余数,因为最后放的当然是右括号
回溯递归分别放左右括号,分别-1递归;
*/
vector<string> strs;//储存合适的括号组合
void dfs(int left, int right, string curstr)
{
if(left == 0 && right == 0)
{
strs.push_back(curstr);
return;
}
if(left <= right && left >=0)
{
dfs(left-1, right, curstr+"(");
dfs(left, right-1, curstr+")");
}
}
int main()
{
int n;
cin >> n;
dfs(n, n, "");
cout << "[";
for(int i=0; i<strs.size()-1; i++)
{
cout << strs[i] << ", ";
}
cout << strs[strs.size()-1];
cout << "]";
// cout << "Hello world!" << endl;
return 0;
}