小M的最长回文子串挑战 | MarsCode AI刷题

81 阅读4分钟

问题描述 小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)

中心扩展法在处理回文长度为偶数的情况时,需要考虑以两个相邻字符为中心进行扩展。具体来说,对于每个字符,我们不仅要检查以该字符为中心的奇数长度回文,还要检查以该字符和下一个字符为中心的偶数长度回文。

具体步骤

  1. 遍历字符串中的每一个字符

    • 对于每个字符 s[i],我们分别以 s[i] 为中心和以 s[i]s[i+1] 为中心进行扩展。
  2. 扩展回文

    • 奇数长度回文:以 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 函数中,leftright 初始值相同,表示以单个字符为中心进行扩展。
  • 偶数长度回文:在 expand_around_center 函数中,leftright 初始值分别为 ii+1,表示以两个相邻字符为中心进行扩展。

通过这种方式,我们可以同时处理奇数长度和偶数长度的回文,确保找到最长的回文子串。