思路:
括号匹配可以直接用栈匹配,这里使用递归,主要递归方式为
- 首先全部左括号,任何对数括号都会有这种形式
(((())))
- 由于左括号放在最前面的方式,只有这一种排列,所以需要回退,把第四个左括号先不匹配,那么左括号就会出现在右括号后面,这时候再递归,就会产生几种新的排列
((()()))
((())())
((()))()
- 依次这样进行下去,直到放在最左边的左括号只有1个,这是最后一种,所有对数都会有这种形式
()()()()
- 其实就是模拟一个栈的回退过程,栈和递归是可以互换的
代码:(C++)
#include<iostream>
using namespace std;
//括号的对数,放在这里避免递归存放太多参数
int size;
/*
left:左括号使用个数
right:右括号使用个数
result:拼接的字符串
*/
void place(int left, int right,string result)
{
//退出条件,左括号大于最大,或者右括号大于左括号
if(left > size || right > left)
return;
//打印条件
if(left == size && right == size)
{
cout<<result<<endl;
}
else
{
//左括号小于最大值,还可以加
if(left < size)
{
result += "(";
place(left+1,right,result);
//由于用的是字符串,当递归返回时,得把之前的为下一层添加的符号去掉
result = result.substr(0,result.size()-1);
}
//右括号小于左括号数,还可以加
if(right < left)
{
result += ")";
place(left,right+1,result);
//由于用的是字符串,当递归返回时,得把之前的为下一层添加的符号去掉
result = result.substr(0,result.size()-1);
}
}
}
int main()
{
cin>>size;
place(0,0,"");
}
结果: