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

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


相关文章
|
23天前
|
消息中间件 算法 Java
抖音面试:说说延迟任务的调度算法?
Netty 框架是以性能著称的框架,因此在它的框架中使用了大量提升性能的机制,例如 Netty 用于实现延迟队列的时间轮调度算法就是一个典型的例子。使用时间轮调度算法可以实现海量任务新增和取消任务的时间度为 O(1),那么什么是时间轮调度算法呢?接下来我们一起来看。 ## 1.延迟任务实现 在 Netty 中,我们需要使用 HashedWheelTimer 类来实现延迟任务,例如以下代码: ```java public class DelayTaskExample { public static void main(String[] args) { System.ou
28 5
抖音面试:说说延迟任务的调度算法?
|
8天前
|
存储 算法 Java
面试高频算法题汇总「图文解析 + 教学视频 + 范例代码」之 二分 + 哈希表 + 堆 + 优先队列 合集
面试高频算法题汇总「图文解析 + 教学视频 + 范例代码」之 二分 + 哈希表 + 堆 + 优先队列 合集
|
1月前
|
机器学习/深度学习 编解码 算法
算法工程师面试问题总结 | YOLOv5面试考点原理全解析
本文给大家带来的百面算法工程师是深度学习目标检测YOLOv5面试总结,文章内总结了常见的提问问题,旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中,我们还将介绍一些常见的深度学习目标检测面试问题,并提供参考的回答及其理论基础,以帮助求职者更好地准备面试。通过对这些问题的理解和回答,求职者可以展现出自己的深度学习目标检测领域的专业知识、解决问题的能力以及对实际应用场景的理解。同时,这也是为了帮助求职者更好地应对深度学习目标检测岗位的面试挑战,提升面试的成功率和竞争力。
|
1月前
|
机器学习/深度学习 算法 固态存储
深度学习算法工程师面试问题总结| 深度学习目标检测岗位面试总结
本文给大家带来的百面算法工程师是深度学习目标检测岗位面试总结,文章内总结了常见的提问问题,旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中,我们还将介绍一些常见的深度学习目标检测面试问题,并提供参考的回答及其理论基础,以帮助求职者更好地准备面试。通过对这些问题的理解和回答,求职者可以展现出自己的深度学习目标检测领域的专业知识、解决问题的能力以及对实际应用场景的理解。同时,这也是为了帮助求职者更好地应对深度学习目标检测岗位的面试挑战,提升面试的成功率和竞争力。
|
18天前
|
数据采集 算法 数据挖掘
LeetCode 题目 80:删除排序数组中的重复项 II【算法面试高频题】
LeetCode 题目 80:删除排序数组中的重复项 II【算法面试高频题】
|
1月前
|
算法 前端开发 Android开发
Android文字基线Baseline算法的使用讲解,Android开发面试题
Android文字基线Baseline算法的使用讲解,Android开发面试题
Android文字基线Baseline算法的使用讲解,Android开发面试题
|
1月前
|
算法 搜索推荐 索引
数据结构与算法⑥(第二章OJ题,下)后八道链表面试题(下)
数据结构与算法⑥(第二章OJ题,下)后八道链表面试题
28 0
|
1月前
|
算法 程序员 索引
数据结构与算法⑥(第二章OJ题,下)后八道链表面试题(中)
数据结构与算法⑥(第二章OJ题,下)后八道链表面试题
29 0
|
1月前
|
算法 C语言 C++
数据结构与算法⑥(第二章OJ题,下)后八道链表面试题(上)
数据结构与算法⑥(第二章OJ题,下)后八道链表面试题
18 0
|
1月前
|
算法 测试技术
数据结构与算法⑤(第二章OJ题,上)前五道链表面试题(下)
数据结构与算法⑤(第二章OJ题,上)前五道链表面试题
26 0