动态规划(JAVA)-最长回文子序列

如何通过普通递归,过渡到动态规划(java)
摘要由CSDN通过智能技术生成

动态规划(JAVA)-最长回文子序列

leetcode 题目连接

给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

一个简易思路,将字符串s翻转,当做第二个参数,求出来的最长公共子序列就是字符串s的最长回文子序列,对于如何求最长公共子序列的可以看我这篇文章

解题思路

分析

  • 首先确定可变参数(i,j),假设回文子序列的中点的下角标为 a,a有可能是一个,也有可能是两个,比如"d12bb21c"中,a的值既是3,也是4,对应的"bb",那么有"i<=a"和"j>=a";
  • 确定特殊值:
    • 当i==j的时候,可以确定当前i或者j所在的字符为一个回文子序列,只不过长度是1,对应的是a为一个值时;
    • 当i==j+1的时候,且两个位置所在的字符相等时,i与j的两个字符共同组成一个回文子序列,如上面"d12bb21c"中的"bb",此时长度为2;
  • 确定可能出现的情况,按照可变参数确定,现假设i对应的字符为n,j对应的字符为m
    • 回文子序列即不以n开头,也不以m结尾,对应的参数变化就是:(i+1,j-1);
    • 回文子序列不以n开头,但是以m结尾,对应的参数变化就是:(i+1,j);
    • 回文子序列以n开头,不以m结尾,对应的参数变化就是:(i,j-1);
    • 回文子序列即以n开头,也以m结尾,对应的参数变化也是:(i+1,j-1),但是需要额外判断m==n;
  • 题目要求最大回文子序列,那么对四种情况的结果取max值即可

确定好思路后,开始尝试写代码

	public static int longestPalindromeSubseq(String s) {
   
        char[] chars = s.toCharArray();
        return recursion(chars,0,chars.length-1);
    }

    private static int recursion(char[] chars
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值