问题描述
小R有一个字符串 s
,她想知道这个字符串中字典序最大的后缀的回文值分别是多少。
字符串的回文值定义为:字符串的最长回文子串长度。
测试样例
样例1:
输入:
s = "abc"
输出:1
样例2:
输入:
s = "ababa"
输出:3
样例3:
输入:
s = "racecar"
输出:7
初读题目,我们可能对回文值感到陌生,这时不妨使用一下AI刷题的思路提示功能,看看对于题目的理解能否起到帮助。不出所料,豆包MarsCode给我们解释了什么是回文值:回文值是指字符串的最长回文子串的长度。我们需要计算字典序最大的后缀的最长回文子串的长度。知道了回文值是什么之后,为了高效写出答案,我们先结合一下豆包MarsCode提供的思路:
问题理解
- 字典序最大的后缀:我们需要找到字符串
s
中字典序最大的后缀。字典序最大的后缀是指在所有后缀中,按字典序比较最大的那个。 - 回文值:回文值是指字符串的最长回文子串的长度。我们需要计算字典序最大的后缀的最长回文子串的长度。
数据结构与算法步骤
-
找到字典序最大的后缀:
- 遍历字符串
s
的所有后缀。 - 比较每个后缀的字典序,记录字典序最大的后缀。
- 遍历字符串
-
计算最长回文子串的长度:
- 对于找到的字典序最大的后缀,使用中心扩展法或 Manacher 算法来计算最长回文子串的长度。
具体步骤
-
遍历所有后缀:
- 从字符串的每个位置开始,截取后缀。
- 比较当前后缀与已知的最大后缀,更新最大后缀。
-
计算回文值:
- 使用中心扩展法,从每个字符和每两个字符之间向两边扩展,检查是否构成回文。
- 记录最长的回文子串长度。
这样就轻松地写出了最终答案:
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"))