32. 最长有效括号
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"
class Solution {
public int longestValidParentheses(String s) {
int[] dp = new int[s.length()];
int res = 0;
for(int i=1;i<dp.length;i++) {
if(s.charAt(i)==')') {
if(s.charAt(i-1) == '(') {
dp[i] =(i>=2?dp[i-2]:0) +2;
}else if(i-dp[i-1]>0 &&s.charAt(i-dp[i-1]-1)=='('){
dp[i] =dp[i-1]+(i-dp[i-1]-2>=0?dp[i-dp[i-1]-2]:0)+2;
}
res = Math.max(res,dp[i]);
}
}
return res;
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
栈实现
class Solution {
public int longestValidParentheses(String s) {
Stack<Integer> stack = new Stack<Integer>();
int max = 0;
stack.push(-1);
for(int i=0;i<s.length();i++) {
if(s.charAt(i)==')') {
stack.pop();
if(stack.isEmpty()) {
stack.push(i);
}else {
max = Math.max(max,i-stack.peek());
}
}else {
stack.push(i);
}
}
return max;
}
}