微软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++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C#数据结构与算法揭秘二
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C++联合体转换成C#结构的实现方法
- C#实现的算24点游戏算法实例分析
- C++编写简单的打靶游戏
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- C++中调用Lua函数实例