最长回文子串解析

前言

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

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

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

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为结束

当s[i]!=s[j],此时dp[i] [j]肯定不是回文子串 此时就为false

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

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

当i+1!=j,此时需要看内部字符串是不是满足回文 就是dp[i+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);
        
    }

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

相关推荐
寻寻觅觅☆7 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
偷吃的耗子7 小时前
【CNN算法理解】:三、AlexNet 训练模块(附代码)
深度学习·算法·cnn
青云计划8 小时前
知光项目知文发布模块
java·后端·spring·mybatis
赶路人儿8 小时前
Jsoniter(java版本)使用介绍
java·开发语言
化学在逃硬闯CS8 小时前
Leetcode1382. 将二叉搜索树变平衡
数据结构·算法
ceclar1238 小时前
C++使用format
开发语言·c++·算法
探路者继续奋斗8 小时前
IDD意图驱动开发之意图规格说明书
java·规格说明书·开发规范·意图驱动开发·idd
Gofarlic_OMS9 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
夏鹏今天学习了吗9 小时前
【LeetCode热题100(100/100)】数据流的中位数
算法·leetcode·职场和发展
消失的旧时光-19439 小时前
第十九课:为什么要引入消息队列?——异步系统设计思想
java·开发语言