最长连续子序列偏移_BAT 高频面试题 | 最长回文子串

d2fedeeab669aae8730c485ef7bdf49d.png

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

5.最长回文子串

题目描述:

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

示例 1

e0bedc8b156b9519c927c74d084d4551.png

示例 2

d451fc2e51cbcc900020e26bf61cd2e6.png
7f283d12c7f5d4d1331bd5b67ed83124.png

暴力法

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

C++ 实现

566b7cf5027b2310aa770b7bb01e07bc.png

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

387977bec367aa138b1db248246c176b.png

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

C++ 实现

b84dbef0f81813c623fc779064e2a86b.png

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

8c939d2e203cae9d3c88b3f73b8aa864.png

动态规划

初始状态

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

C++ 实现

0a6929192b3d76a0b03689a91ca852ac.png
6d804e349acb8d8a0ac48eb8e8ee41b0.png

中心扩展法

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

C++ 实现

f45d4c07f815f714d98833253833c34f.png
e799385ecc2a3f741dbd039b31b178f7.png

Manacher

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

本文作者:陈乐乐

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值