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

Day 51 || 647. 回文子串、516.最长回文子序列

647. 回文子串

题目链接:力扣题目链接

思路:这个需要想到如果两个对比位置小于等于一时候只要相等就成立,但是要是大于一时候就需要判断两者之间是否成立,比如i-j大于1,那么i+1到j-1就应该要成立那么i到j才能成立。因为要判断dp[i + 1][j - 1]是否成立,这个是从左下计算的,所以可以知道这个dp中i要从左下开始遍历。

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

还有一个双指针思路

class Solution {
    public int countSubstrings(String s) {
        int len, ans = 0;
        if (s == null || (len = s.length()) < 1) return 0;
        //总共有2 * len - 1个中心点
        for (int i = 0; i < 2 * len - 1; i++) {
            //通过遍历每个回文中心,向两边扩散,并判断是否回文字串
            //有两种情况,left == right,right = left + 1,这两种回文中心是不一样的
            int left = i / 2, right = left + i % 2;
            while (left >= 0 && right < len && s.charAt(left) == s.charAt(right)) {
                //如果当前是一个回文串,则记录数量
                ans++;
                left--;
                right++;
            }
        }
        return ans;
    }
}

516.最长回文子序列

题目链接:力扣题目链接

思路:遍历顺序同“647. 回文子串”,但是需要注意的是这个是最长的,初始化的时候dp[i][i]都是1,要是i和j大于等于一而且相等就是dp[i][j] = dp[i + 1][j - 1] +2这个好理解就是两者中间长度加上2,否则dp[i][j] = Math.max(dp[i][j - 1],dp[i + 1][j])这个要理解成为分别抛弃左右一个能达到的最长序列。

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

时间:1.5h


http://www.kler.cn/a/386649.html

相关文章:

  • 探索 Python HTTP 的瑞士军刀:Requests 库
  • FPGA学习(10)-数码管
  • 【AutoGen 】简介
  • Webkit 滚动条样式属性
  • C++算法练习-day40——617.合并二叉树
  • JVM 中的完整 GC 流程
  • 青少年编程与数学 02-003 Go语言网络编程 11课题、Go语言网络编程
  • qt QHttpMultiPart详解
  • 学习记录:js算法(八十八):分割回文串
  • 关于 el-table 的合计行问题
  • 接收nVisual中rabbitmq数据不成功问题排查
  • LeetCode30:串联所有单词的子串
  • ElasticSearch向量检索技术方案介绍
  • 设计模式之原型模式(上机考试多套试,每人题目和答案乱序排列场景)
  • YOLO11 旋转目标检测 | 数据标注 | 自定义数据集 | 模型训练 | 模型推理
  • 导师双选系统开发:Spring Boot技术详解
  • 在ubuntu2204上以 All-in-One 模式安装 KubeSphere
  • koa安装与使用
  • 【数据结构-合法括号字符串】力扣1963. 使字符串平衡的最小交换次数
  • shell中执行hive指令以及hive中执行shell和hdfs指令语法
  • 安卓逆向之socket抓包
  • 系统架构设计师论文:单元测试方法及其运用
  • 算法每日双题精讲——双指针(有效三角形的个数,和为s的俩个数)
  • Java-字符串常量池
  • WPF之iconfont(字体图标)使用
  • 【网络】完美配置 HTTPS:优化 SSL/TLS 证书以增强网站安全和性能