Leetcode 32 - Longest Valid Parentheses(线性dp)
来源:互联网 发布:深圳赛维网络董事长 编辑:程序博客网 时间:2024/06/11 07:25
题意
给定一个括号序列,求其中合法的最长括号序列的长度
思路
很久以前做过一道类似的题,是用区间dp,
状态表示:
其实我们的括号序列无非就这两种情况的嵌套:()()和(())。根据以上的状态表示我们列出对应的d[]数组:
( ) ( )
4 0 2 0
( ( ) )
4 2 0 0
当我们开始处理s[i]时,若
关键就是左括号:
首先,我们需要找到需要和当前左括号匹配的那个括号的位置,我们记那个括号的位置是nm(need_to_match),计算可得:
nm的得出:d[i + 1]为我们的s[i + 1]匹配的括号长度,即从i + 1开始,走过d[i + 1]的序列是已经匹配过的,所以需要和我们s[i]匹配的位置
当我们得到nm后,因为s[i] == (,若s[nm] == ),则d[i] = 0。
不然,我们的s[nm] == ),即s[i]和s[nm]是匹配的。
首先,d[i] = d[i + 1] + 2(d[i + 1]为s[i + 1]匹配的括号长度,我们需要在i + 1的基础上叠加上当前匹配的())。
然后,我们还要考虑这样一种情况,就nm + 1之后匹配的长度我们也要叠加上,因为我们d[i]表示的是从i开始的满足条件的括号序列的长度,则i到nm是满足条件的,我们还需要加上nm+1满足条件的那段序列(即可以考虑这样一种情况:(())())。所以此时d[i]还要叠加上d[nm + 1]。(可以参考一道类似的题: HDU1506-Largest Rectangle in a Histogram(dp) )。
转移方程:
s[i]==) :d[i] = 0;s[i]==( :nm=i+1+d[i+1] s[nm]==′)′:d[i]=d[i+1]+2 ,且若nm+1<n :d[i]+=d[nm+1]nm<n s[nm]==′(′:d[i]=0nm<n
时间复杂度:
空间复杂度:
代码
const int maxn = 100000 + 5;int d[maxn];class Solution {public: int longestValidParentheses(string s) { memset(d, 0, sizeof(d)); int n = s.length(), res = 0; if (n == 0) return 0; d[n - 1] = 0; //init, the last element is 0 for (int i = n - 2; i >= 0; i--) { if (s[i] == ')') d[i] = 0; else { int nm = i + 1 + d[i + 1]; //the position that current element need to match if (nm < n && s[nm] == ')') { d[i] = d[i + 1] + 2; int nxt = nm + 1; if (nxt < n) d[i] += d[nxt]; } } res = max(res, d[i]); } return res; }};
- Leetcode 32 - Longest Valid Parentheses(线性dp)
- [leetcode] Longest Valid Parentheses DP~!
- LeetCode (32) Longest Valid Parentheses
- LeetCode(32)Longest Valid Parentheses
- [Leetcode] #32 Longest Valid Parentheses
- [Leetcode] 32 - Longest Valid Parentheses
- LeetCode 32 Longest Valid Parentheses
- Leetcode 32 Longest Valid Parentheses
- leetcode 32 -- Longest Valid Parentheses
- LeetCode---(32)Longest Valid Parentheses
- leetcode 32 : Longest Valid Parentheses
- leetcode 32: Longest Valid Parentheses
- [leetcode 32]Longest Valid Parentheses
- LeetCode-32 Longest Valid Parentheses
- Leetcode #32 Longest Valid Parentheses
- Leetcode#32||Longest Valid Parentheses
- leetcode-32 Longest Valid Parentheses
- leetcode 32:Longest Valid Parentheses
- Java多线程编程核心技术第三章笔记
- iOS 音频打断事件的处理
- sql获取时间段
- 打造 Recyclerview 的万能 Holder CommonHolder
- 英语前缀总结
- Leetcode 32 - Longest Valid Parentheses(线性dp)
- Zookeeper Api(java)入门与应用
- js对象克隆或复制
- 年度总结
- G++ 编译结果优化方式!!!!!
- JAVA图形界面之JTable
- 互联网上比较热的几个缩写名词
- 接触javascript很久了,每次理解闭包都似是而非,最近在找Web前端的工作,所以需要把基础夯实一下。 本文是参照了joy_lee的博客 闭包 在她这篇博客的基础上以批注的形式力争把我的理解阐述出
- 13款国内外知名PHP集成环境的优缺点分析,PHP集成环境推荐、PHP绿色集成环境推荐