最长括号匹配
来源:互联网 发布:百度云盘mac不可用 编辑:程序博客网 时间:2024/05/16 06:33
本总结是是个人为防止遗忘而作,不得转载和商用。
题目
给定字符串,仅包含左括号‘(’和右括号‘)’,它可能不是括号匹配的,设计算法,找出最长匹配的括号子串,返回该子串的长度。
如:
(():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
- 最长括号匹配长度
- 最长括号匹配问题
- 最长括号匹配
- 最长括号匹配(栈)
- 算法学习-最长括号匹配
- java实现最长匹配括号的长度
- 第32题 最长匹配括号
- [C++]连续最长括号匹配问题
- [算法基础练习]最长括号匹配
- 笔试面试算法经典--最长括号匹配
- 最长括号匹配——递推
- 32.最长的合法括号匹配
- 【LeetCode】最长括号匹配Longest Valid Parentheses
- 括号括号括号匹配
- 正确匹配的最长的括号子串
- 寻找最长的括号匹配 Longest Valid Parentheses
- [LeetCode]—Longest Valid Parentheses 最长括号匹配
- LeetCode | Longest Valid Parentheses(最长有效的括号匹配)
- [android小技巧]如何让光标处于EditText的末尾
- 清除浮动的几种方式
- ARMv8 架构百日谈 第一日
- 欢迎使用CSDN-markdown编辑器
- Java 基础 选择结构程序设计
- 最长括号匹配
- NYOJ-2 括号匹配
- 黑白棋经典残局(8)
- 脸色给谁看呢
- 无中生有之突击NOIP(3)--暴力枚举
- 机器学习编程接口(api)设计(oop 设计)
- 不小心把JRE System Library中的某些Jar包删除了,运行Java程序提示找不到类,并且在项目的头上出现红色的感叹号
- java线程同步的等待通知机制
- kernel 内存分配伙伴算法数学证明