龙空技术网

BAT 高频面试题 | 最长回文子串

力扣LeetCode 1271

前言:

现在咱们对“动态规划最长回文子串”都比较关切,朋友们都需要学习一些“动态规划最长回文子串”的相关文章。那么小编也在网上收集了一些关于“动态规划最长回文子串””的相关知识,希望各位老铁们能喜欢,你们一起来学习一下吧!

本期力扣(LeetCode)精选题解由我们的用户“陈乐乐”倾情撰写,一起来看看吧!

5.最长回文子串

题目描述:

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

示例 2:

暴力法

菜鸡的我第一想法只能想到暴力法,遍历各种可能结果。

C++ 实现

该办法效率太低,所以力扣测试用例只能通过 46 个,后续的会超出时间限制。

将字符串 s 反转得到字符串 rev,再求他们的最长公共子串,再判断该最长公共子串是否就是我们要找的最长回文子串。

C++ 实现

注:该方法虽然比暴力法高效,但是在查找最长公共子串的部分效率还是不够高,所以在力扣中最后一个测试用例会超出时间限制。

动态规划

初始状态:

dp[i][i]=1;//单个字符是回文串dp[i][i+1]=1 if s[i]=s[i+1];//连续两个相同字符是回文串

C++ 实现

中心扩展法

回文中心的两侧互为镜像。因此,回文可以从他的中心展开,并且只有 2n-1 个这样的中心(一个元素为中心的情况有 n 个,两个元素为中心的情况有 n-1 个)。

C++ 实现

Manacher

这是一个专门用作处理最长回文子串的方法,思想很巧妙,比较难以理解,这里直接借用了别人的讲解方法。其实主要思想是,把给定的字符串的每一个字母当做中心,向两边扩展,这样来找最长的子回文串,这个叫中心扩展法,但是这个方法还要考虑到处理 abba 这种偶数个字符的回文串。Manacher 法将所有的字符串全部变成奇数个字符。

本文作者:陈乐乐

声明:本文归作者版权所有,如需转载请联系。

标签: #动态规划最长回文子串