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

LeetCode:516.最长回文子序列

跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的!
代码随想录

LeetCode:516.最长回文子序列
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
示例 1:
输入:s = “bbbab”
输出:4
解释:一个可能的最长回文子序列为 “bbbb” 。
示例 2:
输入:s = “cbbd”
输出:2
解释:一个可能的最长回文子序列为 “bb” 。

  • 类似上一题
  • dp[i][j]表示字符串s[i, j]范围内最长的回文子序列的长度为dp[i][j]
  • 初始化:和上一题一样,在s.charAt(i) == s.charAt(j)相等时分开考虑:i, j重合,相差1,相差大于1,则不需要初始化
  • 递推公式:当i, j 相等时:如果i,j重合则dp[i][j] = 1;如果i,j相差1dp[i][j] = 2;如果i,j相差大于1dp[i][j] = dp[i + 1][j - 1] + 2;当i, j 不相等时:dp[i][j] = Math.max(dp[i][j - 1], dp[i + 1][j])
  • 遍历顺序:外层for循环倒序,内存for循环正序
	public int longestPalindromeSubseq(String s) {
        int[][] dp = new int[s.length()][s.length()];
        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 == 0) {
                        dp[i][j] = 1;
                    } else if (j - i == 1) {
                        dp[i][j] = 2;
                    } else {
                        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];
    }

另一种写法,i, j相等时不分开考虑重合,相差1,或者大于1

	public int longestPalindromeSubseq(String s) {
        int len = s.length();
        int[][] dp = new int[len + 1][len + 1];
        for (int i = len - 1; i >= 0; i--) {
            dp[i][i] = 1; // 初始化
            for (int j = i + 1; j < len; 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], Math.max(dp[i][j], dp[i][j - 1]));
                }
            }
        }
        return dp[0][len - 1];
    }

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

相关文章:

  • 冰蝎v4.0.5 来啦
  • Chapter 6 -Fine-tuning for classification
  • 巧妙利用数据结构优化部门查询
  • 四、GPIO中断实现按键功能
  • 算法随笔_37: 交替合并字符串
  • tiktok 国际版抖抖♬♬ X-Bogus参数算法逆向分析
  • 【数据结构】_栈的结构与实现
  • 人工智能专业术语详解(A)
  • Windows:AList+RaiDrive挂载阿里云盘至本地磁盘
  • Javaweb学习之Mysql(Day5)
  • excel电子表(或csv)中如何合并两个工作表,超过1,048,576行
  • 大模型高级工程师实践 - 将课程内容转为音频
  • 手写MVVM框架-收集依赖
  • 优选算法合集————双指针(专题二)
  • ZZNUOJ(C/C++)基础练习1051——1060(详解版)
  • linux 命令笔记
  • Linux(Centos)安装allnnlp失败,jsonnet报错
  • git进阶--4---git rebase 和 git merge的区别与联系
  • kubernetes 核心技术-Helm
  • MySQL 事务实现原理( 详解 )
  • 【web js逆向分析易盾滑块fp参数】逆向分析网易易盾滑块的 fp 参数,仅供学习交流
  • 渗透笔记2
  • 人工智能赋能企业系统架构设计:以ERP与CRM系统为例
  • 【零基础到精通】小白如何自学网络安全
  • 5 前端系统开发:Vue2、Vue3框架(上):Vue入门式开发和Ajax技术
  • 【大数据技术】案例03:用户行为日志分析(python+hadoop+mapreduce+yarn+hive)