问题描述 小M发现了一个神奇的现象,她手中有一个字符串s,她想知道这个字符串中最长的回文子串的长度是多少。你的任务是帮助小M找到该字符串的最长回文子串,并返回它的长度。 回文子串是指从左到右和从右到左字符顺序相同的字符串。
测试样例
样例一 输入:s = "abcbadb" 输出:5 样例二 输入:s = "ababacab" 输出:5 样例三 输入:s = "racecarwk" 输出:7
解题思路 中心扩展法: 遍历字符串中的每一个字符,以该字符为中心,向两边扩展,检查是否形成回文。 由于回文可以是奇数长度(如 "aba")或偶数长度(如 "abba"),我们需要分别考虑这两种情况。 实现步骤: 初始化一个变量 max_length 来记录最长回文子串的长度。 遍历字符串中的每一个字符,分别以该字符为中心,向两边扩展,检查是否形成回文。 更新 max_length 的值。 代码提示 以下是代码的框架,关键步骤def solution(s: str) -> int: # 初始化最长回文子串的长度 max_length = 0
# 遍历字符串中的每一个字符
for i in range(len(s)):
# 检查以当前字符为中心的奇数长度回文
len1 = expand_around_center(s, i, i)
# 检查以当前字符和下一个字符为中心的偶数长度回文
len2 = expand_around_center(s, i, i + 1)
# 更新最长回文子串的长度
max_length = max(max_length, len1, len2)
return max_length
辅助函数:从中心向两边扩展,返回回文的长度
def expand_around_center(s: str, left: int, right: int) -> int: # 当左右指针在字符串范围内且字符相等时,继续扩展 while left >= 0 and right < len(s) and s[left] == s[right]: left -= 1 right += 1 # 返回回文的长度 return right - left - 1
if name == 'main': print(solution("abcbadb") == 5) print(solution("ababacab") == 5) print(solution("racecarwk") == 7)
中心扩展法在处理回文长度为偶数的情况时,需要考虑以两个相邻字符为中心进行扩展。具体来说,对于每个字符,我们不仅要检查以该字符为中心的奇数长度回文,还要检查以该字符和下一个字符为中心的偶数长度回文。
具体步骤
-
遍历字符串中的每一个字符:
- 对于每个字符
s[i],我们分别以s[i]为中心和以s[i]和s[i+1]为中心进行扩展。
- 对于每个字符
-
扩展回文:
- 奇数长度回文:以
s[i]为中心,向两边扩展,检查s[i-1]和s[i+1]是否相等,以此类推。 - 偶数长度回文:以
s[i]和s[i+1]为中心,向两边扩展,检查s[i-1]和s[i+2]是否相等,以此类推。
- 奇数长度回文:以
代码实现
以下是代码的实现细节,关键步骤用注释标出:
def solution(s: str) -> int:
# 初始化最长回文子串的长度
max_length = 0
# 遍历字符串中的每一个字符
for i in range(len(s)):
# 检查以当前字符为中心的奇数长度回文
len1 = expand_around_center(s, i, i)
# 检查以当前字符和下一个字符为中心的偶数长度回文
len2 = expand_around_center(s, i, i + 1)
# 更新最长回文子串的长度
max_length = max(max_length, len1, len2)
return max_length
# 辅助函数:从中心向两边扩展,返回回文的长度
def expand_around_center(s: str, left: int, right: int) -> int:
# 当左右指针在字符串范围内且字符相等时,继续扩展
while left >= 0 and right < len(s) and s[left] == s[right]:
left -= 1
right += 1
# 返回回文的长度
return right - left - 1
if __name__ == '__main__':
print(solution("abcbadb") == 5)
print(solution("ababacab") == 5)
print(solution("racecarwk") == 7)
关键步骤解释
- 奇数长度回文:在
expand_around_center函数中,left和right初始值相同,表示以单个字符为中心进行扩展。 - 偶数长度回文:在
expand_around_center函数中,left和right初始值分别为i和i+1,表示以两个相邻字符为中心进行扩展。
通过这种方式,我们可以同时处理奇数长度和偶数长度的回文,确保找到最长的回文子串。