[算法基础练习]最长括号匹配
2017-04-27 09:46
260 查看
/**最长括号匹配 * <pre> * 输入的字符串只包含左括号,右括号 * 1.起始匹配的位置start=-1,匹配的最长长度ml=0 * 2.遍历第i个字符c * 3.如果c是左括号,压栈 * 4.如果c是右括号,则与栈顶元素进行匹配 * 4.1 如果栈为空,则此时的c无法匹配,更新start=i,为下一次匹配做准备 * 4.2 如果栈非空,则出栈 * 出栈后为空,则更新ml-max(i-start,ml) * 出栈后不为空,则更新ml=max(i-t),t为栈顶元素 * 遍历n个字符,时间复杂度为O(n) * </pre> * @param s * @return */ public int getMaxMatchLength(String s){ if(s==null||s.length()==0){ return 0; } Stack<Integer> stack = new Stack<Integer>(); int start = -1; int ml = 0; for(int i=0;i<s.length();i++){ String c = s.substring(i, i+1); if(c.equals("(")){ stack.push(i); }else if(stack.empty()){//4.1 start = i; }else{ stack.pop(); if(stack.isEmpty()){//4.2 ml = ml<i-start?i-start:ml; }else{//4.2 int t = stack.peek(); ml = ml<i-t?i-t:ml; } } } return ml; } @Test public void test(){ Assert.assertEquals(getMaxMatchLength("(())"), 4); Assert.assertEquals(getMaxMatchLength("((()))"), 6); Assert.assertEquals(getMaxMatchLength("(()"), 2); Assert.assertEquals(getMaxMatchLength("()())"), 4); Assert.assertEquals(getMaxMatchLength("()()()"), 6); }
相关文章推荐
- 【基础练习】【栈】【映射】codevs3543 括号匹配题解
- 蛙蛙推荐:[算法练习]最长不完全匹配子串频率计算
- Longest Valid Parentheses(最长的括号匹配)【面试算法leetcode】
- 【基础练习】【栈】codevs2058 括号匹配题解
- 算法学习-最长括号匹配
- 笔试面试算法经典--最长括号匹配
- 蛙蛙推荐:[算法练习]最长不完全匹配子串频率计算
- 最小括号匹配算法(2013小米笔试)
- 逆向最长匹配算法的实现
- 基于最长词匹配算法变形的分词系统( 文舫工作室贡献 )
- java括号匹配算法
- 算法分析——括号匹配
- 指针实现的栈(包含进制转换算法实现,括号匹配算法实现)【8】
- 数据结构-使用栈进行括号匹配算法
- c语言括号匹配算法
- 趣味算法-括号匹配
- poj 3041 二分匹配 基础题(整理版:基础知识)匈牙利算法
- 关于栈的算法(以括号匹配为例)
- 括号匹配算法思想
- 关于高亮显示括号匹配的算法(delphi)