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

简介: 因此我们可以写出动态规划的状态转移方程: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)


相关文章
|
7天前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
13天前
|
算法 Go
[go 面试] 雪花算法与分布式ID生成
[go 面试] 雪花算法与分布式ID生成
|
1天前
|
JavaScript 算法 索引
【Vue面试题二十三】、你了解vue的diff算法吗?说说看
这篇文章深入分析了Vue中的diff算法,解释了其在新旧虚拟DOM节点比较中的工作机制,包括同层节点比较、循环向中间收拢的策略,并通过实例演示了diff算法的执行过程,同时提供了源码层面的解析,说明了当数据变化时,如何通过Watcher触发patch函数来更新DOM。
【Vue面试题二十三】、你了解vue的diff算法吗?说说看
|
5天前
|
算法
聊聊一个面试中经常出现的算法题:组合运算及其实际应用例子
聊聊一个面试中经常出现的算法题:组合运算及其实际应用例子
|
15天前
|
机器学习/深度学习 算法 数据中心
【机器学习】面试问答:PCA算法介绍?PCA算法过程?PCA为什么要中心化处理?PCA为什么要做正交变化?PCA与线性判别分析LDA降维的区别?
本文介绍了主成分分析(PCA)算法,包括PCA的基本概念、算法过程、中心化处理的必要性、正交变换的目的,以及PCA与线性判别分析(LDA)在降维上的区别。
31 4
|
13天前
|
算法
突击面试:解密面试官的算法题集合
突击面试:解密面试官的算法题集合
|
15天前
|
机器学习/深度学习 算法
【机器学习】解释对偶的概念及SVM中的对偶算法?(面试回答)
解释了对偶的概念,指出对偶性在优化问题中的重要性,尤其是在强对偶性成立时可以提供主问题的最优下界,并且详细阐述了支持向量机(SVM)中对偶算法的应用,包括如何将原始的最大间隔优化问题转换为对偶问题来求解。
27 2
|
15天前
|
机器学习/深度学习 算法 数据挖掘
|
1天前
|
消息中间件 存储 算法
这些年背过的面试题——实战算法篇
本文是技术人面试系列实战算法篇,面试中关于实战算法都需要了解哪些内容?一文带你详细了解,欢迎收藏!
|
17天前
|
算法
分享几道大厂面试算法题
分享几道大厂面试算法题