最长有效括号-动态规划

  • 题目

给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

  • 示例

输入:s = “)()())”
输出:4

  • 动态规划

dp[i]表示以s[i]为结尾的最长有效括号
s[i] =’('时,dp[i]必然为0
s[i] = ’ ) ’ 时,如果s[i-1] = ’ ( ‘,则dp[i] = dp[i-2] + 2
如果s[i-1]= ‘)’,且s[i-1-dp[i-1]] =’'则dp[i] = dp[i-1] + 2 + dp[i-2-dp[i-1]]

  • 代码
 public int longestValidParentheses(String s) {
        int n = s.length();
        int[] dp = new int[n];
        int ans = 0;
        for (int i = 1; i < n; i++) {
            if (s.charAt(i) == ')') {
                if (s.charAt(i-1) == '(') {
                    dp[i] = (i - 2 >= 0 ? dp[i-2] : 0) + 2;
                } else {
                    if (i -1 - dp[i-1] >= 0 && s.charAt(i - 1 - dp[i-1]) == '(') {
                        dp[i] = (i - 2 - dp[i-1] >= 0 ? dp[i-2-dp[i-1]] : 0) + dp[i-1] + 2;
                    }
                }
            } 
        }
        for (int i = 0; i < n; i++) {
            ans = Math.max(ans, dp[i]);
        }
        return ans;
    }

思路在注释中

  • 代码
public int longestValidParentheses(String s) {
        Stack<Integer> stack = new Stack<>();
        // start是每一段的起点
        int start = 0;
        // 记录答案
        int ans = 0;
        for (int i = 0; i < s.length(); i++) {
            // 左括号,就入栈等待匹配
            if (s.charAt(i) == '(') {
                stack.push(i);
            // 右括号
            } else {
                // 栈不空
                if (!stack.isEmpty()) {
                    // 出栈匹配左括号
                    stack.pop();
                    // 出栈,匹配成功则记录最大长度
                    // 如果匹配成功后栈不空,则最大长度为i - start.peek()
                    // 如果匹配成功后栈空,则最大长度为 i - start + 1;
                    if (!stack.isEmpty()) {
                        ans = Math.max(ans, i - stack.peek());                 
                    } else {
                        ans = Math.max(ans, i - start + 1);
                    }
                // 栈空,说明这是第一个右括号数量大于左括号数量的点、
                // 不可能有有效序列跨越此点,去下一段进行判断
                } else {
                    start = i + 1;
                }
            }
        } 
        return ans;
    }

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