LeetCode 题解工作台

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

给你一个下标从 0 开始的字符串 s ,你需要找到两个 不重叠 的回文 子字符串,它们的长度都必须为 奇数 ,使得它们长度的乘积最大。 更正式地,你想要选择四个整数 i , j , k , l ,使得 0 ,且子字符串 s[i...j] 和 s[k...l] 都是回文串且长度为奇数。 s[i...j…

category

3

题型

code_blocks

4

代码语言

hub

3

相关题

当前训练重点

困难 · string·结合·rolling·哈希

bolt

答案摘要

class Solution: def maxProduct(self, s: str) -> int:

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 string·结合·rolling·哈希 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

给你一个下标从 0 开始的字符串 s ,你需要找到两个 不重叠的回文 子字符串,它们的长度都必须为 奇数 ,使得它们长度的乘积最大。

更正式地,你想要选择四个整数 i ,j ,k ,l ,使得 0 <= i <= j < k <= l < s.length ,且子字符串 s[i...j] 和 s[k...l] 都是回文串且长度为奇数。s[i...j] 表示下标从 i 到 j 且 包含 两端下标的子字符串。

请你返回两个不重叠回文子字符串长度的 最大 乘积。

回文字符串 指的是一个从前往后读和从后往前读一模一样的字符串。子字符串 指的是一个字符串中一段连续字符。

 

示例 1:

输入:s = "ababbb"
输出:9
解释:子字符串 "aba" 和 "bbb" 为奇数长度的回文串。乘积为 3 * 3 = 9 。

示例 2:

输入:s = "zaaaxbbby"
输出:9
解释:子字符串 "aaa" 和 "bbb" 为奇数长度的回文串。乘积为 3 * 3 = 9 。

 

提示:

  • 2 <= s.length <= 105
  • s 只包含小写英文字母。
lightbulb

解题思路

方法一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Solution:
    def maxProduct(self, s: str) -> int:
        n = len(s)
        hlen = [0] * n
        center = right = 0

        for i in range(n):
            if i < right:
                hlen[i] = min(right - i, hlen[2 * center - i])
            while (
                0 <= i - 1 - hlen[i]
                and i + 1 + hlen[i] < len(s)
                and s[i - 1 - hlen[i]] == s[i + 1 + hlen[i]]
            ):
                hlen[i] += 1
            if right < i + hlen[i]:
                center, right = i, i + hlen[i]

        prefix = [0] * n
        suffix = [0] * n

        for i in range(n):
            prefix[i + hlen[i]] = max(prefix[i + hlen[i]], 2 * hlen[i] + 1)
            suffix[i - hlen[i]] = max(suffix[i - hlen[i]], 2 * hlen[i] + 1)

        for i in range(1, n):
            prefix[~i] = max(prefix[~i], prefix[~i + 1] - 2)
            suffix[i] = max(suffix[i], suffix[i - 1] - 2)

        for i in range(1, n):
            prefix[i] = max(prefix[i - 1], prefix[i])
            suffix[~i] = max(suffix[~i], suffix[~i + 1])

        return max(prefix[i - 1] * suffix[i] for i in range(1, n))
speed

复杂度分析

指标
时间complexity is O(n) using Manacher's algorithm to generate palindromes and O(n) to combine prefix and suffix maximums. Space complexity is O(n) for storing radii and prefix/suffix arrays.
空间Depends on the final approach
psychology

面试官常问的追问

外企场景
  • question_mark

    Check if candidate palindromes overlap before computing the product.

  • question_mark

    Consider using rolling hash for substring verification if needed.

  • question_mark

    Observe that only odd-length palindromes are relevant; even lengths are ignored.

warning

常见陷阱

外企场景
  • error

    Counting even-length palindromes mistakenly, which violates the problem constraint.

  • error

    Overlapping substrings causing invalid product calculations.

  • error

    Using nested loops to compare all palindrome pairs, which is too slow for large strings.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Maximize the sum of lengths instead of the product of two non-overlapping odd-length palindromes.

  • arrow_right_alt

    Consider even-length palindromes alongside odd-length palindromes for maximum product.

  • arrow_right_alt

    Restrict palindromes to a minimum length k, requiring adjusted prefix/suffix calculations.

help

常见问题

外企场景

两个回文子字符串长度的最大乘积题解:string·结合·rolling·哈希 | LeetCode #1960 困难