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

6de7005801f10273bf1f05dec1eda5da.png

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

5.最长回文子串

5.最长回文子串​leetcode-cn.com
b6184db6024c5459147167ab290af956.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 法将所有的字符串全部变成奇数个字符。

本文作者:陈乐乐

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值