您的位置:首页 > 编程语言 > C语言/C++

微软100题第46题:四对括号可以有多少种匹配排列方式?

2015-06-25 20:28 357 查看

题目:四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(())

分析题目可以得出两个限制条件,a:左右括号数量相同; b:从左往右数,右括号数量不能大于左括号。

方法1:递归的方法,同时满足上面两个条件

void matching(int left, int right, vector<char> & src, int sum, const int N, int &cnt)
{
int t = N<<1;
if(left < right)
return;
if(sum == t)
{
for(int i=0; i< t; i++)
cout<<src[i];
cout<<endl;
cnt++;
}
if(left < N)
{
src.push_back('(');
left++;
sum++;

matching(left, right, src, sum, N,cnt);

src.pop_back();
left--;
sum--;
}
if(right < N)
{
src.push_back(')');
right++;
sum++;

matching(left, right, src, sum, N, cnt);

src.pop_back();
right--;
sum--;
}
}

方法2:采用二进制的方法,4对括号就是8个单个括号组成,可以用8位二进制数字表示,该位为0,表明出现左括号,为1表明出现右括号,从而只要从0~255中去找满足分析中的两个条件的数字就好了。

void matchingother(const int N, int ×)
{
unsigned long limit = 1<<(N<<1);
cout<<limit<<endl;
for(unsigned long i = 0; i<limit; i++)
{
int sum=0;
int t=1;
for(int j=0; j<(N<<1) && sum>=0; ++j, t=t<<1)
{
if( (i & t) != 0)
{
sum+=1;
}
else
{
sum-=1;
}

}
if(sum==0)
{
//display
times++;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 算法