![6de7005801f10273bf1f05dec1eda5da.png](https://i-blog.csdnimg.cn/blog_migrate/2d5e4d1a52d408385f7ce3e7e29ba26e.jpeg)
本期力扣精选题解由我们的用户“陈乐乐”倾情撰写,一起来看看吧!
5.最长回文子串
5.最长回文子串leetcode-cn.com![b6184db6024c5459147167ab290af956.png](https://i-blog.csdnimg.cn/blog_migrate/2cc1ef2452aedf53e3394ccb22ee0736.png)
题目描述:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
解法 1:暴力法
菜鸡的我第一想法只能想到暴力法,遍历各种可能结果。
C++ 实现
class
该办法效率太低,所以力扣测试用例只能通过 46 个,后续的会超出时间限制。
解法 2:
将字符串 s 反转得到字符串 rev,再求他们的最长公共子串,再判断该最长公共子串是否就是我们要找的最长回文子串。
C++ 实现
class
注:该方法虽然比暴力法高效,但是在查找最长公共子串的部分效率还是不够高,所以在力扣中最后一个测试用例会超出时间限制。
解法 3:动态规划
初始状态:
- dp[i][i]=1;//单个字符是回文串
- dp[i][i+1]=1 if s[i]=s[i+1];//连续两个相同字符是回文串
C++ 实现
class
解法 4:中心扩展法
回文中心的两侧互为镜像。因此,回文可以从他的中心展开,并且只有 2n-1 个这样的中心(一个元素为中心的情况有 n 个,两个元素为中心的情况有 n-1 个)。
C++ 实现
class
解法 5:Manacher
这是一个专门用作处理最长回文子串的方法,思想很巧妙,比较难以理解,这里直接借用了别人的讲解方法。其实主要思想是,把给定的字符串的每一个字母当做中心,向两边扩展,这样来找最长的子回文串,这个叫中心扩展法,但是这个方法还要考虑到处理 abba 这种偶数个字符的回文串。Manacher 法将所有的字符串全部变成奇数个字符。
本文作者:陈乐乐
声明:本文归作者版权所有,如需转载请联系。