【算法】【Dynamic Programming】Longest Valid Parentheses
来源:互联网 发布:ubuntu设置不休眠 编辑:程序博客网 时间:2024/06/13 16:59
Difficulty: Hard
Description
Given a string containing just the characters ‘(’ and ‘)’, find the length of the longest valid (well-formed) parentheses substring.
For “(()”, the longest valid parentheses substring is “()”, which has length = 2.
Another example is “)()())”, where the longest valid parentheses substring is “()()”, which has length = 4.
Solution
思路
自己的实现
- 找到
(
开头的字符,一直往下扫描; - 若
(
的数量多于或等于)
的数量,继续扫描(字符串直到目前合法); - 若
(
的数量少于)
的数量,说明不合法,记录之前合法字符串最大长度,回到第1步。
自己的实现有个缺点:扫描到末尾,要从末尾往回再扫描一部分,因为要处理类似(()
的情况。
class Solution {public: int longestValidParentheses(string s) { int len = s.length(); int i = 0, j = -1, max = 0, left = 1, right = 0; for (; i < len && j < len;) { i = j + 1; // 找到'('开头 for (; i < len && s[i] == ')'; ++i) {} if (i < len) { for (j = i + 1; j < len; ++j) { if (s[j] == '(') ++left; else ++right; if (left < right) { max = (max < j - i) ? j - i : max; left = 1; right = 0; break; } } } } // 处理最后的一串括号 --j; while (j > i) { for (; j > i && s[j] == '('; --j) {} if (j > i) { for (right = 0, left = 0; j >= i; --j) { if (s[j] == ')') right++; else left++; if (left > right) break; } } max = (max < 2 * right) ? 2 * right : max; } return max; }};
更好的实现
使用栈,把字符所属的下标一个一个压入栈,若先后压入的下标分别代表(
和)
,则弹出这两个下标,目前下标减去栈顶的下标,则是目前的maxLength
。
class Solution {public: int longestValidParentheses(string s) { stack<int>stackk; int maxLength = 0; //(() stackk.push(-1); for (int i = 0; i < s.size(); ++i) { int t = stackk.top(); if (t != -1 && s[i] == ')' && s[t] == '(') { stackk.pop(); maxLength = max(maxLength, i - stackk.top()); } else { stackk.push(i); } } return maxLength; } int max(int a, int b) { if (a < b) return b; return a; }};
阅读全文
0 0
- 【算法】【Dynamic Programming】Longest Valid Parentheses
- LeetCode算法题目:Longest Valid Parentheses
- 算法练习(12):Longest Valid Parentheses
- LeetCode: Longest Valid Parentheses
- LeetCode Longest Valid Parentheses
- LeetCode: Longest Valid Parentheses
- [Leetcode] Longest Valid Parentheses
- [leetcode]longest Valid Parentheses(!!)
- Longest Valid Parentheses
- Longest Valid Parentheses
- [Leetcode] Longest Valid Parentheses
- leetcode Longest Valid Parentheses
- LeetCode31:Longest Valid Parentheses
- longest valid parentheses
- Longest Valid Parentheses
- 【leetcode】Longest Valid Parentheses
- Longest Valid Parentheses
- [LeetCode]Longest Valid Parentheses
- Data mining(I)
- [JAVA]从零开始的“桌面宠物”之路(一):动画效果
- 下一代GIS的思考-周成虎院士报告
- Kodi
- Android实战—闹钟的简单实现
- 【算法】【Dynamic Programming】Longest Valid Parentheses
- OpenCV3.1.0+OpenCV_contrib库实现KCF论文复现的资源总结
- 捣鼓Raspberry Pi 3 (一)之安装Ubuntu Mate 16.04
- 12306自动刷票下单-查票下单
- react+redux+es6
- Vim快速学习
- 解决Word、Excel启动时提示向程序发送命令出现问题
- UVA
- java 自定义类似C++ Pair