有N对左右括号,问合法排列有多少种?对解法有点不理解求教!

苏1994 2016-02-20 03:04:06
解法跟卡特兰数有关,它要先求出全部可能的(包括不合法的)排列方式,答案说全部可能的(包括不合法的)排列总数是 ,我不明白这个总数为什么这么算?
...全文
657 1 打赏 收藏 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
tcmakebest 2016-02-21
  • 打赏
  • 举报
回复
排列是区分元素顺序的, 组合则不区分元素顺序, 它们的商是所用元素的排列数. 楼主这个问题由于存在规则无法直接用公式计算答案,只能穷举,一是得出排列再判断规则,二是递归法根据规则来进行排列. 这段代码是递归法,并且能够输出排列到日志

		ArrayList<String> list = new ArrayList<String>();
		int n = 4;
		int count = Calc(list,0,n,n);
		Log.e("calc=", ""+count);

	/**
	 * 
	 * @param i 左-右括号数量
	 * @param a 剩余左括号数量
	 * @param b 剩余右括号数量
	 * @return
	 */
	private int Calc(ArrayList<String> list,int i, int a, int b) {
		if(a+b==0){
			StringBuffer sb = new StringBuffer();
			for(String s : list) {
				sb.append(s);
			}
			Log.e("item", sb.toString());
			return 1;// 左右括号全部用完时为一个答案
		}
		
		int num = 0;
		if(a>0) {
			list.add("(");
			num += Calc(list,i+1, a-1, b);// 左括号只要有总是可以用
			list.remove(list.size()-1);
		}
		if(i>0 && b>0) {
			list.add(")");
			num += Calc(list,i-1, a, b-1);// 右括号要有并且有未匹配的左括号时可以用
			list.remove(list.size()-1);
		}
		return num;
	}

80,490

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧