题目链接:剑指offer.85
生成 n 对括号共需要 2n 步,每一步都面临两个选项,即生成左括号或者右括号,题目要求返回所有的情况,所以本问题很适合采用回溯法。
在生成左右括号时存在两个限制条件,一个是左括号或者右括号的数量都不能超过 n 个,第二个是已经生成的右括号数量不能超过左括号。在同时需要满足以上两个限制条件的前提下,选择生成的括号并调用递归函数
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void solve(int left,int right,vector<string> &vec,string &str)
{
//当左右括号都使用完的时候,即是一种答案解
if(left == 0 && right == 0)
{
vec.emplace_back(str);
return ;
}
//当左括号还有的时候,加入左括号
if(left > 0)
{
str.push_back('(');
solve(left-1,right,vec,str);
str.pop_back();
}
// 剩下的左括号数量小于剩下的右括号数量,则可以加入右括号
if(left < right)
{
str.push_back(')');
solve(left,right-1,vec,str);
str.pop_back();
}
}
int main()
{
int n;
cin>>n;
int left=n;//剩余左括号的个数
int right=n;//剩余右括号的个数
vector <string> vec;
string str{""};
solve(left,right,vec,str);
for(auto a:vec)
{
cout<<"["<<a<<"]"<<" ";
}
}