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

138 阅读3分钟

一、题目理解

  1. 题目描述

    • 题目给定一个字符串 s,需要找出这个字符串中最长的回文子串的长度。
    • 回文子串是指从左到右和从右到左字符顺序相同的字符串。
  2. 测试样例分析

    • 样例 1:

      • 输入:s = "abcbd"
      • 输出:5
      • 解释:最长回文子串是 "abcba",长度为 5。
    • 样例 2:

      • 输入:s = "ababacab"
      • 输出:5
      • 解释:最长回文子串是 "ababa",长度为 5。
    • 样例 3:

      • 输入:s = "racecarwk"
      • 输出:7
      • 解释:最长回文子串是 "racecar",长度为 7。

二、代码分析

  1. 函数定义

    • 代码中定义了一个函数 solution(s),这个函数用于计算给定字符串 s 中最长回文子串的长度。
def solution(s):
n = len(s)
  • 首先获取字符串 s 的长度 n

  1. 核心函数 expand_around_center

    • 定义了一个函数 expand_around_center(left, right),用于从中心向两侧扩展来寻找回文子串。
def expand_around_center(left, right):
while left >= 0 and right < n and s[left] == s[right]:
left -= 1
right += 1
return right - left - 1
  • 这个函数通过两个指针 left 和 right,从中心向两侧扩展。只要满足以下条件:

    • left 不小于 0(保证不越界)。
    • right 小于字符串长度 n(保证不越界)。
    • s[left] 等于 s[right](保证字符相同,满足回文条件)。
  • 就继续扩展,left 向左移动,right 向右移动。当不满足条件时,返回当前找到的回文子串的长度(right - left - 1)。

  1. 主循环

    • 在 solution 函数中,通过一个循环来遍历字符串中的每个字符,尝试以每个字符为中心寻找回文子串。
max_len = 0
for i in range(n):
len1 = expand_around_center(i, i)
len2 = expand_around_center(i, i + 1)
curr_max_len = max(len1, len2)
max_len = max(max_len, curr_max_len)
return max_len
  • 首先初始化 max_len 为 0,表示目前找到的最长回文子串长度为 0。

  • 对于字符串中的每个字符 i

    • 调用 expand_around_center(i, i) 尝试以单个字符为中心寻找回文子串(适用于奇数长度的回文子串)。
    • 调用 expand_around_center(i, i + 1) 尝试以相邻两个字符为中心寻找回文子串(适用于偶数长度的回文子串)。
    • 取这两种情况中的最大值 curr_max_len
    • 更新全局最大值 max_len
  • 最后返回 max_len,即字符串中最长回文子串的长度。

  1. 测试代码

    • 最后一部分代码用于测试 solution 函数:
if __name__ == '__main__':
print(solution("abcbd") == 5)
print(solution("ababacab") == 5)
print(solution("racecarwk") == 7)
  • 这里调用了 solution 函数并检查返回结果是否与预期的输出一致。

三、算法复杂度分析

  1. 时间复杂度

    • 对于 expand_around_center 函数,每次调用最坏情况下需要遍历字符串的一半长度,时间复杂度为 O(n),其中 n 是字符串的长度。
    • 在 solution 函数中,对于每个字符都可能调用两次 expand_around_center 函数,总共调用  次,每次调用时间复杂度为 O(n),所以总的时间复杂度为 O(n^2)。
  2. 空间复杂度

    • 除了输入字符串 s 占用的空间外,代码中只使用了常数级别的额外空间,所以空间复杂度为 O(1)。