知识库

记录点点滴滴

LeetCode(5):最长回文子串

题目:https://leetcode-cn.com/problems/longest-palindromic-substring/

题目

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

示例 1:

输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。

示例 2:

输入: “cbbd”
输出: “bb”

解法

1. 中心扩展法

顾名思义,该方法的核心思路是,逐一检查字符串中可以构成中心的中间节点(具有如aba或者aa结构的即可视为一个中心节点)。

找到中心节点后,下一步就是确定回文字符串的left和right边界,对于aba结构来说,显然left和right边界即为a对应数组中的位置,而对于aa结构而言,先可以确定一个左边界,由于暂时无法确定后面是否存在多个a(如babaaaab,回文部分是baaaab,有四个a组成),故右边界仍需往下扫描,直到扫描到不是a的部分位置。

找到左右边界后,开始左右同时向两边扩展,若两边界上的元素一致,则继续往下探索,否则停止判断,记录该回文串的长度及下标。

2. 暴力法

选出所有子字符串可能的开始和结束位置,并检验它是不是回文。

3. 动态规划

动态规划的算法核心思想是把多阶段问题转换为单阶段问题

在本题中,可以将字符串回文部分的搜索视为从小到大的过程,即状态方程P(i , j) = ( P(i+1,j-1) && S[i]==S[j] )

这儿需要注意的是,我们采用从小到大的思路去解决问题。因此这儿逐渐要从最小的量到最大的量,因此我们可以从串的长度入手,从小到大。而动态扫描的指标是数组的下标。

4. 马拉车算法

等待更新(https://leetcode-cn.com/problems/longest-palindromic-substring/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-bao-gu/)

点赞

发表评论

邮箱地址不会被公开。 必填项已用*标注