最长回文子序列_动态规划

图片说明

题解

看了网上的很多个博客,还是不会,原因代码没有说明实际意义。

  1. 如下的代码,从一个字符开始,首先一个字符一定是一个回文序列,他的长度是1

  2. 如果确定了一个字符串,比如"adjddd",他的回文序列最大长度是4,那么他的两端再加上一个任意的字符,比如‘t’,"tadjdddt",那么它的长度就是6了。

  3. 如果确定两端字符不同,那么2一定不成立,那么回文序列要让它尽可能长,取下子问题的结中最大的即可,那就损失一个长度([i][j-1],[i+1][j])找最大即可。

  4. 不得不说,dp[i][j]代表的含义是字符字串s[i:j+1]对于该问题的解,即子问题的解。

  5. 由于最低限度的问题:即只有一个字符的时候,我们知道它的解是确定的,所以这个问题可以用递归

    class Solution {
     public int longestPalindromeSubseq(String s) {
         if(s==null || s.length()==0) return 0;
    
         int len = s.length();
         // dp[i][j] 代表是字符串[i:j+1],子串的最长回文序列个数
         int[][] dp = new int[len][len];
    
         for(int i=0;i<len;i++){//一个字符一定是一个回文序列
             dp[i][i] = 1;
         }
    
         // 逐渐扩大子问题的范围
         for(int index=1;index<len;index++){
             int i=0;
             int j=index;
             while(i<len&&j<len){
                 if(s.charAt(i) == s.charAt(j)){ //新增两边的数据相等就可以加上2
                     dp[i][j] = dp[i+1][j-1]+2;
                 }else{ // 两边数据不等的话,找出长度减一的子序列的最大值
                     dp[i][j] = Math.max(dp[i+1][j],dp[i][j-1]);
                 }
                 i++;
                 j++;
             }
         }
    
         // 最终得出从1到n长度的序列的结果
         return dp[0][len-1];
     }
    }

    图片说明

    递归的解法

    class Solution{
     private String str;
     public int longestPalindromeSubseq(String s) {
         this.str = s;
         if(str == null || str.length() == 0){
             return 0;
         }
         return longestSub(0,s.length()-1);
     }
    
     public int longestSub(int start,int end) {
         System.out.println(start + ":" + end);
         if(start == end){
             return 1;
         }
         if(start > end){
             return 0;
         }
         // 走到这里说明他的长度至少是2
         if(str.charAt(start)==str.charAt(end)){
             return 2+longestSub(start+1,end-1);
         }else{ // 不能同时包含两端了,那么只包含一个的最大值
             return Math.max( longestSub(start+1,end),longestSub(start,end-1));
         }
     }

    这种方法对于小数据类是非常的OK的,但是一旦字符串的长度是几百几千,那么栈空间将会爆战,不会出现正确 结果
    图片说明
    图片说明
    长度为6的递归调用已经很恐怖了,如果一直走第二条路,最坏情况,指数式增长,所以,这个只供理解就好了。

全部评论

相关推荐

头像
04-27 15:11
已编辑
华东师范大学 算法工程师
暑期实习从2月开始投,面了两个月,流程该挂的都挂完了,腾讯字节一共号称是1.7w个hc,不知道都发给谁了,估计今年秋招要难顶。Timeline米哈游、美团、蚂蚁、微软等公司直接简历挂穿,没进面。携程:3.3&nbsp;投递、测评3.12&nbsp;笔试3.18&nbsp;一面3.25&nbsp;二面4.13&nbsp;ai面(hr面)4.14&nbsp;英语测评4.23&nbsp;offer(已拒)腾讯:2.6&nbsp;测评2.28&nbsp;wxg一面3.5&nbsp;wxg二面(挂)3.11&nbsp;teg一面3.21&nbsp;teg二面(取消)3.31&nbsp;teg一面4.10&nbsp;teg二面(挂)4.21&nbsp;wxg一面4.24&nbsp;wxg二面(挂)字节:1.28&nbsp;aml约面(取消)3.17&nbsp;火山一面(挂)4.8&nbsp;aml一面(挂)4.20&nbsp;抖音data一面(挂)阿里:3.23&nbsp;投递、测评3.28&nbsp;笔试3.31&nbsp;淘天一面4.8&nbsp;钉钉一面4.9&nbsp;淘天二面4.10&nbsp;阿里控股一面4.12&nbsp;钉钉二面(取消)4.15&nbsp;淘天hr面4.16&nbsp;淘天offer(已接)4.21&nbsp;高德一面(取消)4.22&nbsp;淘宝闪购一面(取消)面试最大的感触是,现在撞上ai转型,一堆老业务急着转向,新业务非常不成熟,研究型的组bar非常高根本进不去,业务侧挂着算法的岗位干的都是工程活,面试却又要问算法,另外agent的落地也远没有那么广,绝大多数还是那套写死的系统调一下llm&nbsp;api或者做做rag,其余少部分真的在搭agent的,基本不能在线上服务用什么很智能的模型,现阶段成本太高,进去大概率就是给垃圾模型从工程方面兜底,除了业务场景的应用和数据经验以外,技术方面很难有什么提升。算法岗做不了基模的还是去搜广推好,之前判断失误了完全没投,秋招不知道还进不进得去。
嵌入式的小白:不错啊,淘天也是挺好的,恭喜
我的求职进度条
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务