【LeetCode】5. 最长回文子串

138 阅读1分钟

image.png

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • 1 <= s.length <= 1000
    • s 仅由数字和英文字母组成

二、思路分析:

我们拿到本题,读取本题内容要求在指定字符串中找出最长回文子串,在解答题目之前我们需要明确几点:

  • 子串:是在原字符串的一段连续字集
  • 子序列:是在原字符串的子集
  • 回文子串:左右字符串相等。例如“abcba”

如何求出最长的回文子串,可以使用暴力求解、中心扩展算法方法,思路如下:

  • 方法一:暴力求解:

    • 定义res变量来存储回文子串,初始化""
    • start是回文子串的起始位置,位置坐标计算位置取i-len(res)-1,0的最大值
    • 使用临时变量tmp来取字符串s之间start与i+1
    • 当tmp子串与tmp[::-1]相等时,默认是回文子串,并将res子串更新
    • 当tmp更新tmp[1:],当tmp与tmp[::-1]时,则将res子串更新
    class Solution(object):
        def longestPalindrome(self, s):
            """
            :type s: str
            :rtype: str
            """
            res = ""
            for i in range(len(s)):
                start = max(i-len(res)-1,0)
                tmp = s[start:i+1]
                if tmp == tmp[::-1]:
                    res = tmp
                else:
                    tmp = tmp[1:]
                    if tmp == tmp[::-1]:
                        res = tmp
            return res
    
  • 方法二: 中心扩散算法

    • 定义一个回文字符串函数根据指定的left >=0,right < len(s)-1,s[left]==s[right],并返回回文子串的长度right-left-1
    • 回文字符串长度有奇数和偶数长,奇数长度的回文字符串中心位置i,偶数长度的中心位置i,i+1
    • 调用函数分别求出奇数长度和偶数长度,Len取最大值
    • 回文字符串中start位置则i-(Len-1)/2
    • 回文字符串中end位置则为i+Len/2
    • 直到遍历完字符串s,返回s[start:end+1]
    • 流程图 (12).jpg
class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        def centerAccount(left,right):
            while left >= 0 and right < len(s) and s[left] == s[right]:
                left -=1
                right +=1
            return right-left-1
        start,end = 0,0
        for i in range(len(s)):
            evenum = centerAccount(i,i+1)
            ordnum = centerAccount(i,i)
            Len = max(evenum,ordnum)
            if Len > end - start:
                start = i - (Len-1) / 2
                end = i + Len / 2
        return s[start:end+1]  

三、总结:

本题考察在字符串中找到最长回文子串,此题有四种解法暴力求解、中心扩展算法、马拉车算法和动态规化,作为小白目前只掌握前面两种,后续继续跟上,AC 提交代码记录:

image.png

  • 时间复杂度:O(n^2),其中 n 是字符串的长度。长度为 1 和 2 的回文中心分别有 n 和 n−1 个,每个回文中心最多会向外扩展 O(n) 次
  • 空间复杂度:O(1),只需要额外的常数级别的空间

以上是本期内容,欢迎大佬们点赞评论,下期见~~~