青训营X豆包MarsCode技术训练营|豆包MarsCode AI刷题

18 阅读2分钟

问题描述

小R有一个字符串 s,她想知道这个字符串中字典序最大的后缀的回文值分别是多少。

字符串的回文值定义为:字符串的最长回文子串长度。


测试样例

样例1:

输入:s = "abc"
输出:1

样例2:

输入:s = "ababa"
输出:3

样例3:

输入:s = "racecar"
输出:7

初读题目,我们可能对回文值感到陌生,这时不妨使用一下AI刷题的思路提示功能,看看对于题目的理解能否起到帮助。不出所料,豆包MarsCode给我们解释了什么是回文值:回文值是指字符串的最长回文子串的长度。我们需要计算字典序最大的后缀的最长回文子串的长度。知道了回文值是什么之后,为了高效写出答案,我们先结合一下豆包MarsCode提供的思路:

问题理解

  1. 字典序最大的后缀:我们需要找到字符串 s 中字典序最大的后缀。字典序最大的后缀是指在所有后缀中,按字典序比较最大的那个。
  2. 回文值:回文值是指字符串的最长回文子串的长度。我们需要计算字典序最大的后缀的最长回文子串的长度。

数据结构与算法步骤

  1. 找到字典序最大的后缀

    • 遍历字符串 s 的所有后缀。
    • 比较每个后缀的字典序,记录字典序最大的后缀。
  2. 计算最长回文子串的长度

    • 对于找到的字典序最大的后缀,使用中心扩展法或 Manacher 算法来计算最长回文子串的长度。

具体步骤

  1. 遍历所有后缀

    • 从字符串的每个位置开始,截取后缀。
    • 比较当前后缀与已知的最大后缀,更新最大后缀。
  2. 计算回文值

    • 使用中心扩展法,从每个字符和每两个字符之间向两边扩展,检查是否构成回文。
    • 记录最长的回文子串长度。

这样就轻松地写出了最终答案:

def solution(s):
n = len(s)
max_len = 0
max_suffix = ""
for i in range(n):
    suffix = s[i:]
    def expand_around_center(left, right, suffix_len): 
        while left >= 0 and right < suffix_len and suffix[left] == suffix[right]:
            left -= 1
            right += 1
        return right - left - 1
    max_palindrome_len = 0
    suffix_len = len(suffix) 
    for j in range(suffix_len):
        max_palindrome_len = max(max_palindrome_len, expand_around_center(j, j, suffix_len) , expand_around_center(j, j + 1, suffix_len))
    if suffix > max_suffix:
        max_suffix = suffix
        max_len = max_palindrome_len
return max_len

print(solution("abc"))
print(solution("ababa"))
print(solution("racecar"))