来自:http://bbs.csdn.net/topics/350118968
搜狐:
四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(())
---------------------------------------------
这题直接用栈的思想就可以了,刚开始我还想直接用全排列的方法来解决,发现问题变得更加复杂了,因为重复问题不好解决,所以这里还是利用递归从简单思路出发比较方便。
1:从左边起算,左括号一定大于等于右括号
2:左括号,右括号个数均不能超过总数一半
利用上面这两个条件就可以写出递归
对于全排列问题大家可以想想。。
//============================================================================
// Name : BracketsPermutation.cpp
// Author : YLF
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <list>
using namespace std;
void BracketPermutation(int left, int right, int num);
int count = 0;
list<char> arrayList;
int main() {
BracketPermutation(0,0,8);
cout<<count;
return 0;
}
void BracketPermutation(int left, int right, int num){
if(left<right)//条件一
return;
if(num == 0){
std::_List_iterator<char> it = arrayList.begin();
count++;
for(;it!=arrayList.end();it++)
cout<<*it;
cout<<endl;
}
//条件2
if(left<4){
arrayList.push_back('(');
num--;
left++;
BracketPermutation(left, right, num);
arrayList.pop_back();
num++;
left--;
}
if(right<4){
arrayList.push_back(')');
num--;
right++;
BracketPermutation(left, right, num);
arrayList.pop_back();
num--;
right--;
}
}
(((())))
((()()))
((())())
((()))()
(()(()))
(()()())
(()())()
(())(())
(())()()
()((()))
()(()())
()(())()
()()(())
()()()()
14
我检查了下4个括号和6个括号的结果:
(())
()()
2
((()))
(()())
(())()
()(())
()()()
5