此题解采用了Manacher算法,用于快速计算字符串中的回文子串数量。思路首先是转换原始字符串s,通过在每个字符间插入特殊字符#(以及首尾添加额外字符),使得处理过程中可以统一奇数长度和偶数长度的回文子串。例如,'abc'变为'$#a#b#c#!'。这种转换让每个字符都成为了潜在的回文中心。接着,使用数组f来存储以每个字符为中心的最长回文半径。通过动态更新中心iMax和当前最远回文右边界rMax来减少不必要的比较,优化算法效率。最终,通过对数组f的遍历,并依据每个位置的回文半径计算回文子串的数量,得到总的回文子串数。
时间复杂度: O(n)
空间复杂度: O(n)
class Solution:
def countSubstrings(self, s: str) -> int:
n = len(s)
t = '$#'
for ch in s:
t += ch
t += '#'
n = len(t)
t += '!'
f = [0] * n
iMax = rMax = ans = 0
for i in range(1, n):
if i > rMax:
f[i] = 1
else:
f[i] = min(rMax - i + 1, f[2 * iMax - i])
while t[i + f[i]] == t[i - f[i]]:
f[i] += 1
if i + f[i] - 1 > rMax:
iMax = i
rMax = i + f[i] - 1
ans += f[i] // 2
return int(ans)