参考博客:https://blog.youkuaiyun.com/dyx404514/article/details/42061017
作用
时间复杂度
O
(
n
)
O(n)
O(n)
可以求出一个串中最长回文子串长度,回文子串个数,每个位置的最长回文子串长度。
基本变量
char str[]
: 输入的字符串。
char tmp[]
: 预处理过后的字符串。
int mx
: 当前最长回文子串匹配的最右位置。
int po
: 当前最长回文子串的中点位置。
int Len[i]
: 最长回文子串最右端离i的距离。
Len[i]-1
: 该回文串在原字符串中的长度。
(Len[i]-i)/2
:该回文串在原字符中的起始位置。
步骤
- 预处理:开头和末尾加一个特殊字符防止越界,将原字符串每个字符之间都插入
#
。 - 计算Len[] 。 如果 i < mx,j为i相对于po的对称位置,且Len[j] <= mx-i。那么Len[i] = Len[j],否则i就需要重新匹配。
自己的体会
经过预处理之后,便只有奇数的回文子串,字符串中的#
其实就代表最长回文子串为偶数的情况,例如只考虑回文长度为4的aaaa
,处理过后变成aa#aa
,这里的#
其实就代表着aaaa
这个回文子串。而正常的字符代表的是为奇数长度的回文子串。