[leetcode]Longest Valid Parentheses
2017-05-28 11:02
337 查看
32. Longest Valid Parentheses
DP solution:
stack solution
在栈中存没配对的括号的位置,则夹在相邻两个未配对括号中的是配对的。
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.
DP solution:
// dp[i] represents the longest valid parentheses ending at // i-1 th character: s[i - 1] int longestValidParentheses(string s) { int N = s.length(); if (N <= 1) return 0; vector<int> dp(N + 1, 0); for (int i = 2; i <= N; ++i) { // if s[i - 1] == '(', there will be no valid // parentheses ending at s[i - 1] if (s[i - 1] == '(') dp[i] = 0; else { // if there exists valid parentheses ending at s[i - 2] and the // character before the valid parentheses is '('. // (()) i = 4, dp[3] = 2, s[0] == '(', then dp[4] = dp[3] + 2 = 4 if (dp[i - 1] && i - dp[i - 1] > 1 && s[i - 2 - dp[i - 1]] == '(') dp[i] = 2 + dp[i - 1]; // no valid ending at s[i - 2] but s[i - 2] == '(' // (), i = 2, dp[i] = 2 else if (dp[i - 1] == 0 && s[i - 2] == '(') dp[i] = 2; else dp[i] = 0; } // add preceding valid parentheses. // ()(()) i = 6, dp[6] = 2 + dp[5] + dp[2] = 6 // ()() i = 4, dp[4] = 2 + dp[2] if (dp[i] && i - 1 - dp[i] > 0 && dp[i - dp[i]]) dp[i] += dp[i - dp[i]]; } int res = 0; for (auto len : dp) res = max(len, res); return res; }
stack solution
在栈中存没配对的括号的位置,则夹在相邻两个未配对括号中的是配对的。
int longestValidParentheses(string s) { int N = s.length(); if (N <= 1) return 0; stack<int> st; int res = 0; for (int i = 0; i < N; ++i) if (s[i] == '(') st.push(i); else if (st.size() && s[st.top()] == '(') st.pop(); else st.push(i); < 998b span class="hljs-keyword">if (st.empty()) res = N; else { int a = N, b = 0; while (st.size()) { b = st.top(); st.pop(); res = max(res, a - b - 1); a = b; } res = max(res, a); } return res; }
相关文章推荐
- LeetCode:Longest Valid Parentheses
- LeetCode 32. Longest Valid Parentheses
- [LeetCode]32 Longest Valid Parentheses
- [Leetcode] #32 Longest Valid Parentheses
- 【LeetCode-面试算法经典-Java实现】【032-Longest Valid Parentheses(最长有效括号)】
- 【leetcode】括号符匹配问题(Parentheses):Valid Parentheses|Generate Parentheses|LongestValid Parentheses
- Java [leetcode 32]Longest Valid Parentheses
- leetcode32 Longest Valid Parentheses 最长有效括号序列
- leetcode 32. Longest Valid Parentheses
- LeetCode - 32. Longest Valid Parentheses
- LeetCode 32 Longest Valid Parentheses (栈 推荐)
- Leetcode 栈 Longest Valid Parentheses
- LeetCode Longest Valid Parentheses
- [leetcode] Longest Valid Parentheses
- [Leetcode] Longest Valid Parentheses (Java)
- LeetCode | Longest Valid Parentheses
- [Leetcode] longest valid parentheses 最长的有效括号
- Longest Valid Parentheses @Leetcode -- Python
- LeetCode----Longest Valid Parentheses
- leetcode 32 Longest Valid Parentheses