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

算法训练营第五十九天|LeetCode647、516

题目连接:647. 回文子串 - 力扣(LeetCode)

个人思路:dp数组的含义是:dp[i][j]:s字符串下标i到下标j的字串是否是一个回文串

这里我出现了错误

为什么出错呢?代码如下:

class Solution {
    public int countSubstrings(String s) {
        boolean[][] dp = new boolean[s.length()][s.length()];
        int result =0 ;
        for(int i=s.length()-1;i>=0;i--){
            for(int j=i;j<s.length();j++){
                if(s.charAt(i)==s.charAt(j)){
                    System.out.println(s.charAt(i)+s.charAt(j));
                    if(i-j<=1){
                        dp[i][j] = true;
                        result++;
                    }else if(dp[i+1][j-1]){
                        result++;
                        dp[i][j] = true;                        
                    }
                }
            }
        }
        return result;
    }
}

我错把j-i写成了i-j,因为j是不断往上加的,所以到了最后两端的时候,j肯定比i大,这个时候i-j就肯定是负数,那么结果就会误加1,这就是我错误的由来

还有一个错误是数组越界

class Solution {
    public int countSubstrings(String s) {
        boolean[][] dp = new boolean[s.length()][s.length()];
        int result =0 ;
        for(int i=s.length()-1;i>=0;i--){
            for(int j=0;j<s.length();j++){
                if(s.charAt(i)==s.charAt(j)){
                    System.out.println(s.charAt(i)+s.charAt(j));
                    if(i-j<=1){
                        dp[i][j] = true;
                        result++;
                    }else if(dp[i+1][j-1]){
                        result++;
                        dp[i][j] = true;
                        
                    }
                }
            }
        }
        return result;

    }
}

我错误的把j初始化成0,而且j-i也写成了i-j,i-j为什么会数组越界呢?理由是此时i-j>1那么就会触发这个代码

因为j初始化为0,所以j-1必然-1因此报错

然后j不能初始化成0的原因是会造成重复

代码

class Solution {
    public int countSubstrings(String s) {
        boolean[][] dp = new boolean[s.length()][s.length()];
        int result =0;
        for(int i=s.length()-1;i>=0;i--){
            for(int j=i;j<s.length();j++){
                if(s.charAt(i)==s.charAt(j)){
                    if(j-i<=1){
                        dp[i][j] = true;
                        result++;
                    }else if(dp[i+1][j-1]){
                        result++;
                        dp[i][j] = true;                
                    }
                }
            }
        }
        return result;
    }
}

题目链接:516. 最长回文子序列 - 力扣(LeetCode)

个人思路:这道题也简单,dp数组的含义是字符串s在[i, j]范围内最长的回文子序列的长度为dp[i][j]。

初始化是基于递推公式推导的,如果循环到两个最外层字符相等时,那么dp[i][j] = dp[i+1][j-1]+2;

如果不相等,那么就考虑取i到j-1的范围或者i+1到j的范围,从中选择最大值。

此外,两个指针遍历的过程中,会指向相同元素,这是递推公式所没有考虑到的,因此当指向相同元素的时候,也就是指向了一个元素,那么单个元素的最长回文子序列是1,因此使用for循环初始化成1

代码

class Solution {
    public int longestPalindromeSubseq(String s) {
        int[][] dp = new int[s.length()][s.length()];
        for(int i=0;i<s.length();i++){
            dp[i][i] = 1;
        }
        for(int i=s.length()-1;i>=0;i--){
            for(int j = i+1;j<s.length();j++){
                if(s.charAt(i)==s.charAt(j)){
                    dp[i][j] = dp[i+1][j-1]+2;

                }else{
                    dp[i][j] = Math.max(dp[i+1][j],dp[i][j-1]);
                }
            }
        }
        int res = 0;
        for(int i=0;i<s.length();i++){
            for(int j=0;j<s.length();j++){
                res = Math.max(dp[i][j],res);
            }
        }
        return res;
    }
}

相关文章:

  • 音视频开发—MediaCodec 解码H264/H265码流视频
  • 【python进阶】序列切片还能这么用?切片的强大比你了解的多太多
  • 内网升级“高效安全”利器!统信软件发布私有化更新管理平台
  • 什么是Vue
  • [图像识别]关于cv2库无法安装的故障问题解决,全网最全解决方案!本人亲身测试,参考了stackoverflow、51CTO等博客文章总结而成
  • 菜鸟刷题Day5
  • 22 k8s常用命令
  • 接口的定义和实现
  • 蓝桥杯冲刺 - week1
  • windows微服务部署
  • 深入了解JVM:Java程序背后的核心原理
  • 【新星计划2023】SQL SERVER (01) -- 基础知识
  • 【Node.js】身份认证,Cookie和Session的认证机制,express中使用session认证和JWT认证
  • 算法基础-回溯算法
  • SpringBoot整合Flink(施耐德PLC物联网信息采集)
  • 07.Android之多媒体问题
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • mysql_config not found
  • Shadow DOM 内部构造及如何构建独立组件
  • springboot_database项目介绍
  • vagrant 添加本地 box 安装 laravel homestead
  • vue2.0项目引入element-ui
  • 高程读书笔记 第六章 面向对象程序设计
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 区块链共识机制优缺点对比都是什么
  • 让你的分享飞起来——极光推出社会化分享组件
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • FaaS 的简单实践
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • !!java web学习笔记(一到五)
  • #、%和$符号在OGNL表达式中经常出现
  • #define与typedef区别
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $.ajax()方法详解
  • (33)STM32——485实验笔记
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (windows2012共享文件夹和防火墙设置
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (七)c52学习之旅-中断
  • (未解决)macOS matplotlib 中文是方框
  • .net core控制台应用程序初识
  • .NET 服务 ServiceController
  • .NET 使用配置文件
  • .net6Api后台+uniapp导出Excel
  • .Net7 环境安装配置
  • .net开发引用程序集提示没有强名称的解决办法
  • ::
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [Codeforces] combinatorics (R1600) Part.2
  • [ffmpeg] aac 音频编码