给定括号对数求匹配的数目
一,题目
2对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(())
思路:采用递归的方式进行搜索
核心代码:
方法一:深度搜索到叶节点后,再判断是否匹配
void matchnum1(int nsize,int len,vector<char> &v)
{
/*
cout<<"nsize:"<<nsize<<"len:"<<len<<endl;
vector<char>::iterator i;
for(i=v.begin();i!=v.end();i++)
cout<<*i;
cout<<endl;
*/
if(len==0)
{
int left=0,right=0;
vector<char>::iterator it;
for(it=v.begin();it!=v.end();it++)
{
if(*it=='(')
left++;
else right++;
if(right>left) return;
else if(right==left&&right==nsize)
{
vector<char>::iterator t;
for(t=v.begin();t!=v.end();t++)
cout<<*t;
cout<<endl;
return;
}
}
}
else
{
v.push_back('(');
matchnum1(nsize,len-1,v);
v.pop_back();
v.push_back(')');
matchnum1(nsize,len-1,v);
v.pop_back();
}
}
方法二: 深度搜索时进行截枝
void matchnum2(int nsize,int len,vector<char> &v)
{
/*
cout<<"nsize:"<<nsize<<"len:"<<len<<endl;
vector<char>::iterator i;
for(i=v.begin();i!=v.end();i++)
cout<<*i;
cout<<endl;
*/
int left=0,right=0;
vector<char>::iterator it;
for(it=v.begin();it!=v.end();it++)
{
if(*it=='(')
left++;
else right++;
if(right>left) return;
else if(right==left&&right==nsize)
{
vector<char>::iterator t;
for(t=v.begin();t!=v.end();t++)
cout<<*t;
cout<<endl;
return;
}
}
if(len>0)
{
v.push_back('(');
matchnum2(nsize,len-1,v);
v.pop_back();
v.push_back(')');
matchnum2(nsize,len-1,v);
v.pop_back();
}
}