最长括号匹配
2016-10-23 12:28
134 查看
本总结是是个人为防止遗忘而作,不得转载和商用。
题目
给定字符串,仅包含左括号‘(’和右括号‘)’,它可能不是括号匹配的,设计算法,找出最长匹配的括号子串,返回该子串的长度。如:
(():2
()():4
()(()):6
(()()):6
分析
解这个问题需要用到栈。而其做法就是:
初始化:
起始匹配位置为start= -1,最大匹配长度ml = 0。
考察第i个字符c:
c是左括号:入栈;
c是右括号:
如果栈为空,表示没有匹配的左括号,因此令:
start = i,为下一次可能的匹配做准备
如果栈不为空:出栈。然后:
如果栈为空,则i -start就是当前的匹配长度,因此令
ml = max(i - start, ml)
如果栈不为空,则当前栈顶元素t是上次匹配的最后位置,令:
ml= max(i - t, ml)
注:因为入栈的一定是左括号,显然没有必要将它们本身入栈,应该入栈的是该字符在字符串中的索引,这样更方便写程序。
例子
对于“(()”i=0:(;
i=1:(;
i=2:);
因为,i=0是左括号(,入栈:
栈:(
因为i=1是左括号(,入栈:
栈:( (
因为i=2是右括号),和栈顶元素(下面红色的那个)进行匹配:
栈:( (
所以栈顶元素出栈:
栈:(
因为i已经遍历到最后,且栈不为空,所以令最后一个i=2减去栈顶元素i=0,即:2 - 0 = 2
对于“())”
因为,i=0是左括号(,入栈:
栈:(
因为i=1是右括号),和栈顶元素(下面红色的那个)进行匹配:
栈:(
所以栈顶元素出栈:
栈:
此时栈为空,因此ml = max( (i= 1) - (start = 0), ml ) = 1
因为,i=2是左括号),且已经遍历到最后,且栈为空,所以ml = max( (i=1) - (start=-1)), ml=1) = 2
相关文章推荐
- LeetCode-Longest Valid Parentheses-最长匹配括号-栈的应用
- [C++]连续最长括号匹配问题
- LeetCode: Longest Valid Parentheses (求最长有效匹配括号子串的长度)
- Longest Valid Parentheses(最长的括号匹配)【面试算法leetcode】
- [算法基础练习]最长括号匹配
- 寻找最长的括号匹配 Longest Valid Parentheses
- 两个问题:n对括号有多少种匹配方式与与最长递减子序列
- [luoguP1944] 最长括号匹配_NOI导刊2009提高(1)
- 笔试面试算法经典--最长括号匹配
- 最长括号匹配问题
- 算法学习-最长括号匹配
- 第32题 最长匹配括号
- 洛谷 P1944 最长括号匹配_NOI导刊2009提高(1)
- Longest Valid Parentheses (求最长有效匹配括号子串的长度)
- java实现最长匹配括号的长度
- Longest Valid Parentheses:最长括号子段匹配
- 栈应用——最长括号匹配
- 最长括号匹配(栈)
- 顺序栈(进制转换 + 括号匹配 + 判断栈表 + 最长括号匹配长度)
- Longest Valid Parentheses (求最长有效匹配括号子串的长度)