使用 AI 刷题功能实现求最长回文子串

88 阅读5分钟

使用 AI 刷题功能实现求最长回文子串


在编程学习过程中,我们经常遇到字符串相关的题目,特别是回文子串的问题。回文子串是指一个字符串,正着读和反着读都是相同的。在本次学习中,我选择了一个经典的回文子串问题,并通过豆包MarsCode AI刷题功能的帮助,成功解决了问题。本文将分享我的解题思路、详细解析以及在刷题过程中获得的收获。


一、问题描述

题目要求在给定的字符串中,求出最长的回文子串,并返回其长度。

输入:

一个字符串 ss,其长度在 [1,1000][1, 1000] 范围内。

输出:

一个整数,表示字符串中最长回文子串的长度。

示例:

输入: "babad"

输出: 3

解释: "bab""aba" 都是最长回文子串。


二、解题思路

在解决该问题时,我考虑了几种不同的算法,最终通过扩展中心法(Expand Around Center)来解决。这种方法的时间复杂度较低,且实现简洁,因此非常适合这个问题。

1. 回文子串的性质

回文子串的一个重要性质是,它对称于一个中心点。例如,对于字符串 "abccba",它对称于中心点 "cc"。基于这个性质,我们可以认为每一个回文子串的中心是一个字符或者是两个字符之间的间隔。因此,我们可以将问题转化为寻找每个可能的中心,并从中心向两边扩展,检查回文的长度。

2. 扩展中心法

步骤:

  1. 对于每个字符 s[i]s[i],假设它是回文的中心。
  2. 通过扩展,检查回文子串的长度。如果 s[i−k]==s[i+k]s[i-k] == s[i+k],则扩展继续进行。
  3. 为了处理偶数长度的回文子串,我们需要考虑两个字符之间的间隔作为中心,即 s[i]s[i] 和 s[i+1]s[i+1]。
  4. 最终,从每个可能的中心扩展并更新最大回文子串的长度。

三、代码实现

基于扩展中心法的思路,我编写了以下代码来解决该问题:

def longestPalindrome(s: str) -> int:
    if len(s) <= 1:
        return len(s)

    # 用来保存最长回文子串的长度
    max_len = 1

    def expand_around_center(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

    for i in range(len(s)):
        # 分别以单个字符和两个字符之间的间隔为中心扩展
        len1 = expand_around_center(i, i)   # 单字符为中心
        len2 = expand_around_center(i, i+1) # 两字符为中心
        # 更新最大回文长度
        max_len = max(max_len, len1, len2)

    return max_len

代码详解:

  1. 函数定义: longestPalindrome(s: str) -> int:该函数接收一个字符串 ss,并返回最长回文子串的长度。
  2. 边界条件处理: 当字符串长度小于等于 1 时,直接返回字符串的长度,因为一个字符本身就是回文串。
  3. 中心扩展法: 定义了 expand_around_center(left, right) 函数,用于在给定中心位置扩展并返回回文子串的长度。通过比较 s[left]s[right] 的字符是否相等来决定是否扩展。
  4. 主循环: 对于每个字符(或字符间隔),调用 expand_around_center 方法,计算从该位置扩展的回文子串的长度,并与当前最大回文长度 max_len 进行比较,最终更新 max_len

四、思考与优化

1. 时间复杂度分析:

该算法的时间复杂度为 O(n2)O(n^2),其中 nn 是字符串的长度。每个字符最多扩展 nn 次,并且每次扩展最多进行 O(n)O(n) 次比较。虽然时间复杂度较高,但由于回文子串的特点,它比暴力解法更高效,特别适合解决大部分回文子串的问题。

2. 空间复杂度:

空间复杂度为 O(1)O(1),因为我们只需要常数的额外空间来存储最大回文长度,并没有使用额外的数据结构。

3. 进一步优化:

对于该问题,空间复杂度已经是最优的。对于时间复杂度,可以考虑 Manacher 算法,它的时间复杂度可以降低至 O(n)O(n),但实现起来相对复杂。对于较小的输入,扩展中心法已经足够高效。


五、刷题过程中的感悟与成长

1. 编程思维的提升

通过这道题目的解答,我加深了对“回文”这种特殊字符串特性的理解,掌握了如何利用数学和编程技巧,将问题从看似复杂的回文匹配转化为可通过扩展中心法解决的问题。AI 刷题功能的详细解析和提示帮助我更快速地理解了这些算法思想,并通过反复实践掌握了核心方法。

2. 学会反思与总结

每次遇到问题时,我都会先思考解决思路,再参考 AI 的解题提示。通过不断尝试和错误,我逐渐学会了在解题过程中总结反思,并不断优化自己的代码。在 AI 刷题的陪伴下,我不仅解决了问题,还学会了如何快速定位错误和提升代码质量。

3. 从学习到应用

AI 刷题不仅帮助我在算法上有所突破,还让我逐渐建立了系统的编程知识框架。从基础的字符串处理到复杂的动态规划问题,AI 提供的反馈与建议让我不再单纯依赖书本,而是能够将所学知识灵活应用到实际问题中。


六、总结与展望

通过使用豆包MarsCode AI 刷题功能,我不仅掌握了回文子串问题的解决方法,还学会了如何通过分解问题来提升编程能力。AI 刷题为我提供了一个清晰的学习路径,并通过持续的互动帮助我不断进步。在未来的学习中,我将继续利用 AI 刷题功能,深入掌握更复杂的算法和数据结构,为日后的编程实践打下坚实基础。