看了编程的思路后写的,和标程基本一样
我觉得这个压入-1的操作,不是一般人能想到的
第一遍写的时候用的是Stack,但所用时间是deque的两倍
dp的话是最容易想到的,但方程的推到略有难度
最后一种巧妙的贪心,个人觉得也很难想到orz
class Solution {
public int longestValidParentheses(String s) {
Deque<Integer>stack = new ArrayDeque<Integer>();
stack.push(-1);
int len = s.length();
int ans = 0;
for(int i=0;i<len;i++) {
if(s.charAt(i)=='(') {
stack.push(i);
} else {
stack.pop();
if(stack.isEmpty()) {
stack.push(i);
} else {
ans = Math.max(ans,i-stack.peek());
}
}
}
return ans;
}
}
2021/9/6 dp写法
没有十年脑血栓绝对写不出这个dp,写的我快自闭了。其实两个更新操作真的不难想,我一个小时前刚看题,就想到了,一个是()匹配,另一个是和之前的某个(匹配。比较容易踩坑的是要记得加上dp[end-1]。最后发现这两种情况都可以合并orz。
class Solution {
public int longestValidParentheses(String s) {
int len = s.length();
int[] dp = new int[len];
int ans = 0;
for (int end = 1; end < len; end++) {
if (s.charAt(end) == '(') {
continue;
}
int bef = end - dp[end - 1] - 1;
if (bef >= 0 && s.charAt(bef) == '(') {
dp[end] = dp[end - 1] + 2 + dp[Math.max(bef - 1, 0)];
if (dp[end] > ans) {
ans = dp[end];
}
}
}
return ans;
}
}