很多时候没必要建全局变量,只要传进去就好
比如说,输入 n=3,输出为如下 5 个字符串:
“((()))”, “(()())”, “(())()”, “()(())”, “()()()”
1、一个「合法」括号组合的左括号数量一定等于右括号数量,这个很好理解。
2、对于一个「合法」的括号字符串组合 p,必然对于任何 0 <= i < len§ 都有:子串 p[0…i] 中左括号的数量都大于或等于右括号的数量。
明白了合法括号的性质,如何把这道题和回溯算法扯上关系呢?
算法输入一个整数 n,让你计算 n 对儿括号能组成几种合法的括号组合,可以改写成如下问题:
现在有 2n 个位置,每个位置可以放置字符 ( 或者 ),组成的所有括号组合中,有多少个是合法的?
#include <iostream>
#include<bits/stdc++.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
#define maxn 10000
int res[10000]={0};///1:(,2:)
int fin = 3;
void backtrack(int left,int right)
{
if(left<right)
{
return ;
}///左一定比右多(我这里用的是已使用的个数)
if(left>fin||right>fin)
{
return ;
}
if(left==fin&&right==fin)
{
for(int i=1;i<=fin*2;i++)
{
if(res[i]==1)
{
cout<<"(";
}
if(res[i]==2)
{
cout<<")";
}
if(res[i]==0)
{
break;
}
}
cout<<endl;
return ;
}
///
res[left+right+1]=1;
backtrack(left+1,right);
res[left+right+1]=0;
res[left+right+1]=2;
backtrack(left,right+1);
res[left+right+1]=0;
}
int main(int argc, char *argv[]) {
ios::sync_with_stdio(0);cin.tie(0);
backtrack(0,0);
return 0;
}