之前写过一篇最长回文子序列的博客算法27:最长回文子序列长度(力扣516题)——样本模型 + 范围模型-优快云博客
在那一篇博客中,回文是可以删除某些字符串组成的。比如:
字符串为:a1b3c4fdcdba, 那么最长回文子序列就是 abccba。长度为6。
本题为力扣第5题:最长回文子串
给你一个字符串 s
,找到 s
中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd" 输出:"bb"
解释一下,如果字符串为 abc121dmcba. 那么最长回文子序列为 abc121cba. 而最长回文子串则为:121. 子串必须是连续的。
一眼看上去就是范围模型。而范围模型就是要讨论样本数据的开头和结尾的情况:
1. 如果字符串为空,那么回文为空字符
2. 如果字符长度为1, 回文子串就为字符串本身
3. 如果字符串长度2, 则字符串下标0和1的字符进行比较,相等则为字符串本身;不等的话,返回其中一个字符即可。这是我在提交代码的时候,力扣提示错误的时候发现的。
为什么要单独讨论长度为 1 和 2 的情况?
因为, 范围模型讨论数据的开头和结尾。如果原始字符串长度为2,则直接走上方的3逻辑; 可如果一个很长的字符串,经过不断的递归以后,最终长度为2的时候,这就比较麻烦了。
比如 *******ab****的时候,你就不能随意返回一个字符作为回文了。
如果你返回a, 那么字符串为mnfabbbbbbbbb. 那你肯定是错误的
如果你返回b,那么字符串为mnfaaaaaaaaabb, 那你肯定也是错的。
回文,就是整体与子串的关系
其实,最长回文子串,最难的就是连续子串的判断。
0 | 1 | 2 | 3 | 4 | 5 |
a | c | d | d | c | k |
字符串为 acddck, 下标1和下标4相等,都为c. 如果下标从1到4 是回文。 那么他的子串
下标2到3也必须是回文才行。这才是判断的核心点。 而下方的推导表格,完全符合。
比如这个字符串为abdddfm。那么二维表格为:
我用x代表空字符串
a (0) | b (1) | d (2) | d (3) | d (4) | f (5) | m (6) | |
a (0) | a | X | |||||
b (1) | b | X | |||||
d (2) | d | dd | |||||
d (3) | d | dd | |||||
d (4) | d | X | |||||
f (5) | f | X | |||||
m (6) | < |