当前位置: 首页 > news >正文

【leetcode hot 100 32】最长有效括号

错误解法:暴力解法,判断每一个字符的最长有效括号

class Solution {
    public int longestValidParentheses(String s) {
        Deque<Character> stack = new LinkedList<>();
        int n = s.length();
        int max= 0;
        int curr=0;
        for(int i=0;i<n;i++){
            if(s.charAt(i)=='('){
                stack.push(s.charAt(i));
            }
            if(s.charAt(i)==')'){
                if(!stack.isEmpty()&&stack.peek()=='('){
                    stack.pop();
                    curr+=2;
                    max=Math.max(max,curr);
                }
                else{
                    curr=0;
                    if(!stack.isEmpty()){
                        stack.clear();
                    }
                }
            }
        }
        return max;
    }
}

错误原因:当我们判断到i=2时,无法清除curr=0

在这里插入图片描述

解法一:(动态规划)①定义:dp[i]表示下标为i结尾的最长有效括号数,dp[n] ②初始状态:dp[i]=0 ③状态转移方程

在这里插入图片描述

class Solution {
    public int longestValidParentheses(String s) {
        // 定义:dp[i]表示下标为i结尾的最长有效括号数,dp[n]
        // 初始状态:dp[i]=0
        // 状态转移方程:
        int n = s.length();
        int[] db = new int[n]; // db[i]表示以下标i结尾的最长有效括号
        int max= 0;
        for(int i=1;i<n;i++){
            if(s.charAt(i)==')'){
                // ++时,以2为单位,只要考虑‘)’
                if(s.charAt(i-1)=='('){
                    // [i-1,i]是有效的,由于要求连续性,只要考虑i-2即可
                    db[i] = (i-2>=0?db[i-2]:0)+2;
                }
                else{
                    // 如果i的前一个不为‘(’,可能是已经和别人配对了
                    // 要找已经配对前的是否是‘(’
                    if(i-db[i-1]>0 && s.charAt(i-db[i-1]-1)=='('){
                        // db[i] = (i-db[i-1]-1>=0?db[i-db[i-1]-1]:0)+2;
                        // 要加上db[i-1]
                        // 是i-db[i-1]-2而不是i-db[i-1]-1,已经用i-db[i-1]-1配对了,要看i-db[i-1]-2是否连续
                        db[i] = db[i-1] + ((i-db[i-1]-2)>=0?db[i-db[i-1]-2]:0)+2;
                    }
                }
            }
            max = Math.max(max, db[i]);
        }
        return max;
    }
}

注意:

  • 动态规划要考虑:dp代表什么?dp初始状态?dp动态转移方程?
  • 考虑的是以下标i字符结尾的最长有效括号的长度,所以要在过程中记录最大值max

相关文章:

  • ArrayBlockingQueue的使用
  • 英语学习4.9
  • 基于php的成绩分析和预警与预测网站(源码+lw+部署文档+讲解),源码可白嫖!
  • 十四种逻辑器件综合对比——《器件手册--逻辑器件》
  • 记录centos8安装宝塔过程(两个脚本)
  • 【微知】Mellanox网卡网线插入后驱动的几个日志?(Cable plugged;IPv6 ... link becomes ready)
  • Oracle 23ai Vector Search 系列之5 向量索引(Vector Indexes)
  • 【VitePress】新增md文件后自动更新侧边栏导航
  • LeetCode 1223 投骰子模拟
  • 安卓AssetManager【一】-资源的查找过程
  • 从MySQL快速上手数据仓库Hive
  • 论文阅读笔记——Multi-Token Attention
  • 华为机试—最大最小路
  • 为什么在删除数据库存在‘if exists‘语句
  • 判断两个 IP 地址是否在同一子网 C
  • Redis实现分布式定时任务
  • 畅游Diffusion数字人(23):字节最新表情+动作模仿视频生成DreamActor-M1
  • dfs和bfs算法
  • PyTorch DataLoader 参数详解
  • Autoware源码总结
  • 网站是怎么搭建的/如何做电商 个人
  • notepad做网站技巧/主流搜索引擎有哪些
  • 安徽建工招采平台/英文外链seo兼职
  • led动态视频网站建设/网站接广告
  • 做神马网站优化快速排名软件/国家培训网官网
  • 手机微信网站开发/南京网站seo