最长回文子串解析

前言

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

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

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

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

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

相关推荐
user_admin_god几秒前
第 01 篇:OpenAI 兼容 API 初探 —— 用 curl 跑通第一次对话
java·人工智能·spring boot·语言模型·devops
曹牧3 分钟前
PostMan:400 Bad Request‌
java
devpotato12 分钟前
RPO与RTO:容灾的两个关键指标
java·后端
6Hzlia18 分钟前
【Classic 150 刷题计划】 LeetCode 58. 最后一个单词的长度 | C++ 极简反向遍历与单变量状态机
算法
AgentMaster28 分钟前
企业如何应用智能客服?5 个典型场景的技术架构与实施路径
大数据·算法
宁渡AI大模型29 分钟前
AI 全栈面试新趋势:Vibe Coding、前端、Java 后端高频面试题深度解析|河南宁渡科技有限公司编程教程
java·javascript·人工智能·python·ai大模型
CallFay云起未来39 分钟前
AI客服如何与人工客服协同?从任务路由到上下文交接的Agent架构实践
java·人工智能·文心一言
cfm_291442 分钟前
观察者模式
java
程曦曦1 小时前
MySQL 生产库误删 98 张表后的时间点恢复实战:从 binlog 解析到资金对账
linux·数据结构·其他·算法·ubuntu·运维开发
野生技术架构师1 小时前
1000+ Java面试题知识图谱:从基础语法到分布式架构的完整拓扑
java·面试