面试高频算法题---最长回文子串

简介: 因此我们可以写出动态规划的状态转移方程:F(i,j) = F(i+1,j-1) && (Si==Sj),此方程表示的意思是:F(i+1,j-1)为回文串并且s的第i个字符和第j个字符相等F(i,j)才是回文串。

🍊题目

题目链接:最长回文子串


给一个字符串s,找到s中最长的回文子串

image.png

🍋题目分析

所谓回文就是“雾锁山头山锁雾”,“天连水尾水连天” ,就是正着和反着是一样的


比如“abcdcba”,我们发现这是一个回文串,“bcdcb”也是回文串,“cdc”也是回文串,“d”也是一个回文串,我们可以发现一个规律:回文串去掉一个头和一个尾也是一个回文串


这样我们可以用动态规划的方法来解决这个问题


F(i,j)表示字符串s的第i到第j个字符组成的串,F(i,j)=true表示是回文串,F(i,j)=false表示不是回文串

从上面解释可以知道若F(i+1,j-1)为回文串,并且满足字符串s的第i和第j个字符相等,那么F(i,j)才会是回文串


因此我们可以写出动态规划的状态转移方程:F(i,j) = F(i+1,j-1) && (Si==Sj),此方程表示的意思是:F(i+1,j-1)为回文串并且s的第i个字符和第j个字符相等F(i,j)才是回文串


🍈代码实现

public class Solution {
    public String longestPalindrome(String s) {
        int len = s.length();
        int maxLen = 1; //回文子串的最大长度
        int begin = 0; //回文子串的起始位置
        if(len < 2){ //如果字符串只有一个元素,那么肯定是回文串
            return s;
        }
        //dp[i][j]表示s的第i个到第j个字符是否是回文串
        boolean[][] dp = new boolean[len][len]; 
        for(int i = 0;i < len;i++){ //长度为1的子串是回文串
            dp[i][i] = true;
        }
        char[] arr = s.toCharArray();
        for(int L = 2;L <= len;L++){  //L为子串的长度
            for(int i = 0;i < len;i++){ //i为子串的最左下标
                int j = L + i - 1; //j为子串的最右下标
                if(j >= len){ //下标越界,退出循环
                    break;
                }
                if(arr[i] != arr[j]){ //子串的首尾字符不相等,肯定不是回文串
                    dp[i][j] = false;
                }else {
                    //子串首位元素相等时
                    if(j - i < 3){  //如果子串长度为2,3时,就是回文串
                        dp[i][j] = true;
                    }else {
                        dp[i][j] = dp[i+1][j-1]; //若dp[i+1][j-1]为回文串则就是回文串
                    }
                }
                if(dp[i][j] && j-i+1>maxLen){ //更新最大回文子串的长度和子串的起始位置
                    maxLen = j-i+1;
                    begin = i;
                }
            }
        }
        return s.substring(begin,begin+maxLen); //从s中截取最大的回文子串返回
    }
}


🍏代码解析

image.png

image.png

image.png



🍓复杂度分析

🌾时间复杂度:外部循环子串长度,内部循环子串的起始值,双层循环嵌套,时间复杂度为O(n^2)


🌴空间复杂度:存储动态规划所需要的空间dp[len][len],故空间复杂度为O(n^2)


相关文章
|
算法
面试场景题:如何设计一个抢红包随机算法
本文详细解析了抢红包随机算法的设计与实现,涵盖三种解法:随机分配法、二倍均值法和线段切割法。随机分配法通过逐次随机分配金额确保总额不变,但易导致两极分化;二倍均值法优化了金额分布,使每次抢到的金额更均衡;线段切割法则将总金额视为线段,通过随机切割点生成子金额,手气最佳金额可能更高。代码示例清晰,结果对比直观,为面试中类似算法题提供了全面思路。
1991 16
|
算法 安全 Java
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
628 16
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩分享分库分表的基因算法设计,涵盖分片键选择、水平拆分策略及基因法优化查询效率等内容,助力面试者应对大厂技术面试,提高架构设计能力。
美团面试:百亿级分片,如何设计基因算法?
|
算法 前端开发 Java
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
这篇文章总结了单链表的常见面试题,并提供了详细的问题分析、思路分析以及Java代码实现,包括求单链表中有效节点的个数、查找单链表中的倒数第k个节点、单链表的反转以及从尾到头打印单链表等题目。
225 1
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩在读者群中分享了关于分库分表的基因算法设计,旨在帮助大家应对一线互联网企业的面试题。文章详细介绍了分库分表的背景、分片键的设计目标和建议,以及基因法的具体应用和优缺点。通过系统化的梳理,帮助读者提升架构、设计和开发水平,顺利通过面试。
美团面试:百亿级分片,如何设计基因算法?
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
2484 2
|
机器学习/深度学习 JavaScript 算法
面试中的网红虚拟DOM,你知多少呢?深入解读diff算法
该文章深入探讨了虚拟DOM的概念及其diff算法,解释了虚拟DOM如何最小化实际DOM的更新,以此提升web应用的性能,并详细分析了diff算法的实现机制。
|
消息中间件 存储 算法
这些年背过的面试题——实战算法篇
本文是技术人面试系列实战算法篇,面试中关于实战算法都需要了解哪些内容?一文带你详细了解,欢迎收藏!
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。