Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.
Example 1:
Input: "(()"
Output: 2
Explanation: The longest valid parentheses substring is "()"
Example 2:
Input: ")()())" Output: 4 Explanation: The longest valid parentheses substring is"()()"
可以用 DP或者Stack来解。
栈 Stack:定义个start变量来记录合法括号串的起始位置,遍历字符串,如果遇到左括号,则将当前下标压入栈,如果遇到右括号,如果当前栈为空,则将下一个坐标位置记录到start,如果栈不为空,则将栈顶元素取出,此时若栈为空,则更新结果和i - start + 1中的较大值,否则更新结果和i - 栈顶元素中的较大值。
Java:
public static int longestValidParentheses(String s) {
Stack<int[]> stack = new Stack<int[]>();
int result = 0;
for(int i=0; i<=s.length()-1; i++){
char c = s.charAt(i);
if(c=='('){
int[] a = {i,0};
stack.push(a);
}else{
if(stack.empty()||stack.peek()[1]==1){
int[] a = {i,1};
stack.push(a);
}else{
stack.pop();
int currentLen=0;
if(stack.empty()){
currentLen = i+1;
}else{
currentLen = i-stack.peek()[0];
}
result = Math.max(result, currentLen);
}
}
}
return result;
}
Python:
# Time: O(n)
# Space: O(n)
class Solution2:
# @param s, a string
# @return an integer
def longestValidParentheses(self, s):
longest, last, indices = 0, -1, []
for i in xrange(len(s)):
if s[i] == '(':
indices.append(i)
elif not indices:
last = i
else:
indices.pop()
if not indices:
longest = max(longest, i - last)
else:
longest = max(longest, i - indices[-1])
return longest
C++:
class Solution {
public:
int longestValidParentheses(string s) {
int res = 0, start = 0;
stack<int> m;
for (int i = 0; i < s.size(); ++i) {
if (s[i] == '(') m.push(i);
else if (s[i] == ')') {
if (m.empty()) start = i + 1;
else {
m.pop();
res = m.empty() ? max(res, i - start + 1) : max(res, i - m.top());
}
}
}
return res;
}
};
类似题目:
[LeetCode] 20. Valid Parentheses 合法括号
[LeetCode] 22. Generate Parentheses
[LeetCode] 241. Different Ways to Add Parentheses
[LeetCode] 301. Remove Invalid Parentheses
All LeetCode Questions List 题目汇总