Leetcode 32.最长有效括号

https://leetcode.cn/problems/longest-valid-parentheses/submissions/

一种是靠栈完成

一种是使用一维dp数组优化

注解很详细

class Solution {
    public int longestValidParentheses(String s) {
        int res = 0;
        int start = -1;
        Deque stack = new LinkedList();
        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;
    }
}

你可能感兴趣的:(leetcode,动态规划,算法)