LC 5220. 两个回文子字符串长度的最大乘积

https://leetcode-cn.com/problems/maximum-product-of-the-length-of-two-palindromic-substrings/

这题的关键字在于如何计算:以 `a[i]` 字符为结尾,能产生的最长回文串。得到每个位置所能产生的最长回文串长度之后,就可以更新为 “截止到这个位置能产生的最大回文串” 的信息。

这段代码如下,其中我唯一不太确定的地方就是这个时间复杂度,主要就是 `while s[i] != s[p]` 这段。

def maxdist(s):
    dist = [1] * n

    for i in range(1, n):
        d = dist[i - 1]
        p = i - d - 1

        if p < 0:
            # try small dist.
            d -= 2
            p += 2

        while s[i] != s[p]:
            d -= 2
            p += 2

        if s[i] == s[p]:
            dist[i] = d + 2

        # don't need even length.
        # elif s[i] == s[i - 1]:
        #     dist[i] = 2

    for i in range(1, n):
        dist[i] = max(dist[i], dist[i - 1])

    return dist

不过好像这样也没有问题,因为对于当前位置使用更少的长度的话,那么后面位置检查的长度也会更少。运行起来有点像two chasing pointers的感觉,所以时间复杂度还是有保证的。