https://leetcode.cn/problems/longest-valid-parentheses/submissions/
一种是靠栈完成
一种是使用一维dp数组优化
注解很详细
class Solution {
public int longestValidParentheses(String s) {
int res = 0;
int start = -1;
Deque<Integer> stack = new LinkedList<Integer>();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
stack.push(i);//push符合栈操作
} else {
if (stack.isEmpty()) {
start = i;//不为空,start是不变的
} else {
stack.pop();
if (stack.isEmpty()) {
res = Math.max(res, i - start);
} else {
res = Math.max(res,i-stack.peek());
}
}
}
}
return res;
}
}
class Solution {
public int longestValidParentheses(String s) {
int count = 0;
int[] dp = new int[s.length() + 1];
for (int i = 1; i < s.length(); i++) {//从0也行,不过前面不是(也没必要判断了
if (s.charAt(i) == ')') {
if (s.charAt(i - 1) == '(') {
//每一次都要判断越界
//第一种情况:例如()()形式的直接就计算即可
dp[i] = i - 2 >= 0 ? dp[i - 2] + 2 : 2;
//首先判断s别越界,以及外层括号是否可以组成一个合法连续括号
//i - dp[i - 1] - 1就是内部合法括号的熟练往前再推一位
} else if (i - dp[i - 1] - 1 >= 0 && s.charAt(i - dp[i - 1] - 1) == '(') {
//第二种情况:()(())
//如果前面是(就+2
//并且还在算上之前的值,-2就是往前再推两位,并且也要判断>0至少是1才有可能是一对括号
dp[i] = (dp[i - 1] + 2) + (i - dp[i - 1] - 2 > 0 ? dp[i - dp[i - 1] - 2] : 0);
}
}
count = Math.max(count, dp[i]);
}
return count;
}
}