最长回文子串解析

前言

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

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

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

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);
        
    }

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

相关推荐
To_OC5 分钟前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode
数字杂技师13 分钟前
每条推荐都很准,为什么我还是越刷越无聊?
算法
兰令水16 分钟前
hot100【acm版】【2026.7.14打卡-java版本】
java·数据结构·算法·leetcode·面试
cpp_250140 分钟前
P10098 [ROIR 2023] 地铁建设 (Day 2)
数据结构·c++·算法·贪心·二分答案·洛谷题解
thefool1122661 小时前
Java 数组是引用类型
java
阳明山水2 小时前
TimesFM与Moirai MoE零样本预测解析
人工智能·深度学习·算法·机器学习·架构
铅笔侠_小龙虾2 小时前
Rust 学习(2)-变量、常量与 shadowing
学习·算法·rust
cfm_29142 小时前
Spring监听器
java·spring boot·后端
AI科技星2 小时前
基于全域数学公理体系的三元极值题最简求解法【乖乖数学】
线性代数·算法·游戏·决策树·机器学习·乖乖数学·全域数学
SamDeepThinking2 小时前
Java面向对象在JVM里怎么实现
java·后端·面试