最长回文子串解析

前言

算法部分是我们参加工作面试的重中之重'

最长回文子串是一道面试算法常考题,也是我们算法练习中必不可少的一道题目

我们今天以多种角度去处理这道题目

1.中心拓展算法

分析逻辑

根据我们图中所画出的,中心拓展算法呢就是遍历i,以i为中心,去向两边扩散,找出最长子串

但需注意 回文子串的长度存在奇数与偶数区别,如下图所示

他们两个的遍历起始位置有所差别,我们要想找到最长子串,我们就需要考虑这两种逻辑

以此进行展开遍历 这就是我们使用中心拓展算法解决这道问题的逻辑

这种解法的算法时间复杂度很明显是O(n²) 空间复杂度是O(1);

补充一下substring的用法

两种重载方式:

1.substring(int beginIndex):beginIndex 是起始索引(从 0 开始),表示从字符串的这个位置开始截取,一直到字符串的末尾。

2.substring(int beginIndex, int endIndex):不包含结束索引 位置的字符,截取的子串长度 = endIndex - beginIndex

源码如下:

java 复制代码
 public String longestPalindrome(String s) {
     //中心拓展算法
        int begin=0,len=0;
        int left=0,right=0;
        for(int i=0;i<s.length();i++){
            //奇数遍历
            right=left=i;
            while(left>=0&&right<s.length()&&s.charAt(left)==s.charAt(right)){
                left--;
                right++;
            }
             if(right-left-1>len){
                len=right-left-1;
                begin=left+1;
            }
             //偶数遍历
            left=i;
            right=left+1;
            while(left>=0&&right<s.length()&&s.charAt(left)==s.charAt(right)){
                left--;
                right++;
            }
            if(right-left-1>len){
                len=right-left-1;
                begin=left+1;
            }
        }
       
        return s.substring(begin,begin+len);
    }

2.动态规划的解法

看逻辑图我们可以看到 dp表以i为起始 j为结束

当si!=sj,此时dpi j肯定不是回文子串 此时就为false

当si==sj,此时会有三种情况 i与j位置一样 那它只是一个字符肯定是回文子串,

或者i+1==j,说明i和j相邻,此时也是回文子串

当i+1!=j,此时需要看内部字符串是不是满足回文 就是dpi+1 j-1的结果

按照这个逻辑我们得出填表顺序,从下往上填表而且遍历时保证j不能大于i

该算法时间复杂度为O(n²) 空间复杂度也为O(n²)

java 复制代码
public String longestPalindrome(String s) {
        int n=s.length();
        //初始dp表
        boolean dp[][]=new boolean[n][n];
        //初始化
        //填表
        int begin=0,len=0;
        for(int i=n-1;i>=0;i--){
            for(int j=i;j<n;j++){
              if(s.charAt(i)==s.charAt(j)){
               dp[i][j]= i+1<j?dp[i+1][j-1]:true;
              }
              if(dp[i][j]&&j-i+1>len){
                len=j-i+1;
                begin=i;
              }

            }
        }
        return s.substring(begin,begin+len);
        
    }

这两种方法是解决该问题的主流方法

相关推荐
古法老登瞎折腾4 小时前
大数据智能运维实战(十一):运维 MCP 的工程化——权限、限流、审计与错误处理
java·大数据·运维·spring ai·mcp
飞Link4 小时前
什么是 AirSim?一文读懂无人机仿真平台
python·算法·无人机
智能运维指南5 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
yz_aiks5 小时前
Spring AI 2.1 ChatMemory 已过时用什么替代:迁移到 Session Memory 实战(JDBC 存储与会话压缩)
java·spring boot·大模型·ai agent·spring ai
金銀銅鐵6 小时前
[Java] 用 GUI 展示 EnumMap 增删键值对时的内部变化
java·后端·ai编程
学长毕设6 小时前
基于SpringBoot的上门洗车服务系统设计与实现
java·spring boot·后端
jason成都6 小时前
RTKLIB-Java 多基线联合RTK:FIX率从0%到91.5%的三层根因修复
java·gnss·rtklib·rtklib_java
鱼宵6 小时前
Stream 终端操作一次讲透:collect、count、reduce 怎么选
java·stream·终端操作
一去不复返的通信er6 小时前
贪心算法-合并区间(LeetCode 56)
算法·leetcode·贪心算法
白山编程大哥6 小时前
Java 后端如何优雅地把 List 集合返回给前端
java·前端·list