[leetcode]Longest Valid Parentheses
2015-01-27 23:20
288 查看
Longest Valid Parentheses
题目: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.
解题思路:最容易想到的解法就是穷举法,计算任意两点(i到j)之间有多少个合法的()串,借助动态规划可以得到结果。算法复杂度为:O(n3)。
用栈来解决明显可以减小时间复杂度,但是这里入栈的是元素的索引,这样用于求最长匹配的括号长度。在程序中设置一个匹配起点ptstart用于保存当前匹配的起点,用mxlength来保存当前的匹配最大长度。
每次来了‘(’之后,无条件压栈。如果碰到')'的话,如果栈不为空,就消除栈内栈顶的'('
1.消除掉'('之后,如果栈内还有剩余的‘(’的话,最长的合法长度就是:maxlength = max(i - stack.top() , maxlength); 也就是取:当前')'的index减去栈顶元素的index 和 原来max_length 两者的最大值。
例如:对于这种情况:()(()(),可以正确的得出最大值为4。
2.消除掉')'之后,栈内没有剩余的‘(’了。此时需要引入一个新的变量ptstart,用于表示合法括号字符串的起点。
例如:对于这种情况:())()(),可以正确的得出最大值为4。
start初始为-1,之后每次碰到‘)’且栈为空的时候更新为当前‘)’的index。也就是说无法消除的)之后的括号不可能再和前面的括号合并在一起计算最长序列,所以更新start。
c++代码:
#include <iostream> #include <string> #include <stack> using namespace std; class Solution { public: int longestValidParentheses(string s) { int maxlength = 0; int len = s.length(); int i; int ptstart = -1; stack<int> st; for(i = 0; i < len; i++){ if(s[i] == '('){ st.push(i); } if(s[i] == ')'){ if(st.empty()){ ptstart = i; }else{ st.pop(); if(st.empty()){ maxlength = max(i-ptstart, maxlength); }else{ maxlength = max(i-st.top(),maxlength); } } } } return maxlength; } }; int main(){ Solution s = Solution(); string test = "(()(()"; int r = s.longestValidParentheses(test); cout << r << endl; return 0; }
相关文章推荐
- LeetCode之Longest Valid Parentheses
- 【Leetcode】之Longest Valid Parentheses
- LeetCode - Longest Valid Parentheses
- Longest Valid Parentheses leetcode java
- [LeetCode] Longest Valid Parentheses 动态规划
- [LeetCode]32. Longest Valid Parentheses
- leetcode:Longest Valid Parentheses
- LeetCode:Longest Valid Parentheses
- [LeetCode]32 Longest Valid Parentheses
- [Leetcode] #32 Longest Valid Parentheses
- leetcode32---Longest Valid Parentheses
- 【leetcode】括号符匹配问题(Parentheses):Valid Parentheses|Generate Parentheses|LongestValid Parentheses
- leetCode_Longest Valid Parentheses
- LeetCode题目:32. Longest Valid Parentheses
- Leetcode 栈 Longest Valid Parentheses
- [leetcode] Longest Valid Parentheses
- [Leetcode] Longest Valid Parentheses (Java)
- https://leetcode.com/problems/longest-valid-parentheses/
- LeetCode | Longest Valid Parentheses
- Leetcode #32 Longest Valid Parentheses