本期力扣(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 法将所有的字符串全部变成奇数个字符。
本文作者:陈乐乐
声明:本文归作者版权所有,如需转载请联系。