输入括号的数目,输出括号的各种合法匹配样式 如
输入 2
输出
( ())
()()
据说这是一道某公司的面试题,我们先来分析一下。括号匹配有合法有的不合法 如 (()))( 这样就不是合法的匹配样式。为了避免这种情况的出现,记录当前左括号的个数和右括号的个数,使右括号的个数不大于左括号的个数。主要思想类似于0-1背包问题,当进行到某一步的时候 有两种方法:放'(' 和 放 ')'
void maching(int left,int right,int sum,vector<char> bracket)
{
if (left==sum&&right==sum) //如果左边和右边都为要匹配的个数,则输出结果
{
vector<char>::iterator iter=bracket.begin();
for ( ;iter!=bracket.end();iter++)
{
cout<<*iter<<' ';
}
cout<<endl;
return ;
}
if (left<=sum)
{
bracket.push_back('('); //放入左括号,然后递归
maching(left+1,right,sum,bracket);
bracket.pop_back(); //递归后弹出左括号
}
if (left>right&&left<=sum)
{
bracket.push_back(')');
maching(left,right+1,sum,bracket);
bracket.pop_back();
}
}
int main(int argc, char* argv[])
{
vector<char> bracket; //记录当前的匹配样式
int num;
cin>>num; //输入括号的个数
maching(0,0,num,bracket);
return 0;
}