给定括号对数求匹配的数目

一,题目

       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();
}
}

 

posted @ 2012-08-29 15:50  wuzhibin  阅读(553)  评论(0编辑  收藏  举报