回文子串的两种方法:「中心扩展」&「动态规划」

647. 回文子串

5. 最长回文子串

 

本篇文章将介绍判断回文子串相关的两种方法:「中心扩展」「动态规划」

回文字符串

首先介绍一下什么是回文字符串!

「正向和反向观察得到的字符串顺序是相同的」或者「关于中心对称的字符串」

下面举几个例子:

中心扩展法

基于回文字符串对称性的特点,我们可以采取从中心向两边扩展的方法,得到回文子串

1

当中心是b时,同时向左向右扩展一格,得到的子串为aba,仍然符合回文的性质

继续向左向右扩展一格,得到的子串不符合回文的性质,停止!!

所以:以b为中心,可以得到的回文子串有两个baba

但是,仅仅以单个字母为中心的方法会遗漏掉偶数回文子串的情况,如下图所示:

2

所以我们不仅需要遍历以单个字母为中心的情况,也要遍历以两个字母为中心的情况

总结:「中心扩展法」的思想就是遍历以一个字符或两个字符为中心可得到的回文子串

下面给出模版:

动态规划法

首先我们需要明确dp数组表示什么含义?

这里需要二维的dp[][]数组,dp[i][j]表示子串[i..j]是否为回文子串

当我们判断[i..j]是否为回文子串时,只需要判断s[i] == s[j],同时判断[i-1..j-1]是否为回文子串即可

需要注意有两种特殊情况:[i, i] or [i, i + 1],即:子串长度为 1 或者 2。所以加了一个条件限定j - i < 2

状态转移方程如下:

下面给出模版:

回文子串

下面开始题目实战!!题目详情可见 回文子串

这个题目要求字符串中所有回文子串的数目,我们只需要在判断是回文子串的时候,记录一下数量即可!

中心扩展法

动态规划法

耗时比较

第一行是「动态规划法」的提交情况;第二行是「中心扩展法」的提交情况

所以优先使用「中心扩展法」吧,「动态规划法」只是为了用来理解 DP 解题思想滴!!

7

最长回文子串

下面开始题目实战!!题目详情可见 最长回文子串

这个题目要求最长的回文子串,我们只需要在判断是回文子串的时候,记录一下长度,然后选出最大的长度即可!

中心扩展法

动态规划法

耗时比较

第一行是「动态规划法」的提交情况;第二行是「中心扩展法」的提交情况

所以优先使用「中心扩展法」吧,「动态规划法」只是为了用来理解 DP 解题思想滴!!

8