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

利用栈的思想解决四对括号的匹配排列问题,避免全排列时的重复。条件:左括号大于等于右括号,且左右括号数量不超过总数的一半。递归方法能简化问题解决。

来自: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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值