题目
给你一个字符串 s
,找到 s
中最长的回文子串。
示例
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
题解
1.算法大致思路:
设已知以j为中心的回文字符串的长度为2*length+1,则我们把length称为点j的臂长。点i是在以j为中心的回文字符串上(即j+length-i>=0),点i的关于点j的对称点为2*j-i。已知点2*j-i的臂长为n,则的i的臂长为l=min(j+length-i,n) (因为j的两边是对称的,所以以2j-i的回文字符串在没有超出j的情况下,和以i为中心的回文字符串是一样的,如果超出,则未超出的部分是一样的)。因此以i为中心的回文字符串,可以跳过臂长l的部分,再进行拓展。
2.奇数偶数回文字符串统一:
可以在字符串间插入特殊字符,比如字符串 aaba
处理后会变成 #a#a#b#a#,则不论偶数回文字符aa,和奇数回文字符abc,都会变成奇数回文:#a#a#和#a#b#a#。最后再将特殊符号去掉即可。