给定一个只包含 '('
和 ')'
的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"
思路:1.使用栈进行操作,如果是左括号,直接入stack,如果右括号,如果stack里没有元素匹对,说明有效括号已经结束,更新起始位置,有元素匹对pop出一个左括号匹对,如果此时没了,不能保证不继续有效括号,所以根据当前的最长距离去更新maxlen,如果此时还有 则计算与栈顶的索引相减来计算长度。
代码:
class Solution:
def longestValidParentheses(self, s):
ans = 0
n = len(s)
stack = []
st = 0
for i in range(n):
if s[i] == '(':
stack.append(i)
else:
if len(stack) == 0:
st = i+ 1
continue
else:
stack.pop()
if len(stack) == 0:
ans = max(ans,i - st + 1)
else:
ans = max(ans,i-stack[-1])
return ans
Java版
class Solution {
public int longestValidParentheses(String s) {
int ans = 0;
int n = s.length();
Stack st = new Stack();
int index = 0;
for (int i = 0; i <n ; i++) {
if (s.charAt(i) == '(') st.push(i);
else if (st.size() == 0){
index = i + 1;
continue;
}else {
st.pop();
if (st.empty()){
ans = Math.max(ans,i - index + 1);
}else {
ans = Math.max(ans,i - (int)st.peek());
}
}
}
return ans;
}
}
思路2:动态规划,dp[i]表示从开始到 i 点的最长有效括号的长度(是i点时有效,如果此时 i 为“(”,无效为0)
代码:
class Solution:
def longestValidParentheses(self, s):
s = ')' + s
n = len(s)
if n<2:
return 0
ans = 0
dp = [0] * n
for i in range(1,n):
if s[i] == ')':
if s[i-1-dp[i-1]] == '(':
dp[i] = dp[i - 1] + 2
dp[i] += dp[i-dp[i]]
ans = max(ans,dp[i])
return ans