回溯法解决阿里面试题之括号匹配
2014-08-30 00:21
453 查看
今天参加了阿里的线上笔试,其中有一道题,我只记得大体意思是这样的:
六组括号,可以嵌套,有多少种匹配方式?
其实这是一个很简单的卡塔兰数问题,对卡特兰数不了解的朋友可以到百度百科里了解一下,在此不再赘述,今天我来说说有万能解题法之称呼的解题法怎样解这个问题。
对于这个问题,我们可以看作是12个括号进栈问题,如果进栈的是“)”则弹出栈顶的“(”、“)”,每一次进栈要做以下检查:
1、如果是“(”则要求已经进栈的“(”数量要小于6,即 left<6;
2、如果是“)”则要求栈顶有”(“与之匹配,即 right<left;
剩下的问题就是将原问题分析为,12个括号依次进栈,这12个是”(“还是”)“的问题了,这就是一个标准的子集数问题,我们规定”(“为左子树,”)“为右子树
。下面是java实现代码。
六组括号,可以嵌套,有多少种匹配方式?
其实这是一个很简单的卡塔兰数问题,对卡特兰数不了解的朋友可以到百度百科里了解一下,在此不再赘述,今天我来说说有万能解题法之称呼的解题法怎样解这个问题。
对于这个问题,我们可以看作是12个括号进栈问题,如果进栈的是“)”则弹出栈顶的“(”、“)”,每一次进栈要做以下检查:
1、如果是“(”则要求已经进栈的“(”数量要小于6,即 left<6;
2、如果是“)”则要求栈顶有”(“与之匹配,即 right<left;
剩下的问题就是将原问题分析为,12个括号依次进栈,这12个是”(“还是”)“的问题了,这就是一个标准的子集数问题,我们规定”(“为左子树,”)“为右子树
。下面是java实现代码。
package com.soft; /** * 张猛 * 2014年8月30日 */ public class BracketsLineUp { // 不变信息 static int n; // 动态改变信息 static int left;// 记录“(”的数目 static int right;// 记录“)”的数目 static int count;// 记录解数目 /** * @author zhangmeng *TODO *@param i 表示第i层,由第i个括号决定 */ private static void trackback(int i) { // 更新front if (i < n) { // 如果满足约束条件,搜索左子树 if (left < 6) { // 搜索左子树 left++; BracketsLineUp.trackback(i + 1); //清理现场 left--; } // 如果 满足上界函数,搜索右子树 if (right < 6 && left >right) { // 更新cx right++; trackback(i + 1); //清理现场 right--; } }else{//处理第n层 count++; return; } } public static int LineUpCount() { BracketsLineUp.n = 12; BracketsLineUp.right = 0; BracketsLineUp.left = 0; BracketsLineUp.count = 0; trackback(0); return BracketsLineUp.count; } public static void main(String[] args) { System.out.print(BracketsLineUp.LineUpCount()); } }运行结果:132
相关文章推荐
- 回溯法解决阿里面试题之12人排队
- 【面试题】用栈解决括号匹配问题
- Java 用栈解决括号匹配问题
- 链栈的简单实现及括号匹配问题的链栈解决方法
- 栈用于解决括号匹配问题
- 用回溯法(backtracking)解决平衡集合问题(一道微软公司面试题)
- java实现用栈解决一个串中的括号是否匹配
- 面试题之括号匹配分析
- 栈解决括号匹配
- 阿里面试题 hashtable 如何解决冲突
- java堆栈类解决括号匹配问题
- [C++]连续最长括号匹配问题解决策略二(学习)
- 用C++链式栈解决数据结构中的括号匹配问题。
- 数据结构之括号匹配问题的解决
- [C++]连续最长括号匹配问题解决策略二(学习)
- 数据结构中的栈,在解决很多问题都有用处,比如括号匹配,迷宫求解,表达式求值等等 java中有封装好的类,可以直接调用。
- 【面试题】括号匹配
- Stack解决——括号匹配
- 用堆栈解决括号匹配问题(C语言)
- 《LeetBook》leetcode题解(20):Valid Parentheses[E]——栈解决括号匹配问题