动态规划

最长有效括号

困难#32Java时间 O(n)空间 O(n)

题目要做什么

字符串只包含左、右圆括号。求最长的连续有效括号子串长度。

题目示例输入s = ")()())"
题目示例输出4

01 为什么这样做

dp[i] 表示以位置 i 结尾的有效子串长度。右括号前若是左括号,直接组成一对;若前面已是一段有效括号,则向前跨过这段,寻找配对左括号,再连接更早的有效段。

始终成立的条件

dp[i] 只记录必须以 i 结尾的有效长度,左括号位置的值为 0。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public int longestValidParentheses(String s) {3        int[] dp = new int[s.length()];4        int best = 0;5        for (int i = 1; i < s.length(); i++) {6            if (s.charAt(i) == ')') {7                if (s.charAt(i - 1) == '(') {8                    dp[i] = 2 + (i >= 2 ? dp[i - 2] : 0);9                } else {10                    int j = i - dp[i - 1] - 1;11                    if (j >= 0 && s.charAt(j) == '(') {12                        dp[i] = dp[i - 1] + 2 + (j >= 1 ? dp[j - 1] : 0);13                    }14                }15                best = Math.max(best, dp[i]);16            }17        }18        return best;19    }20}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索