LeetCode-5 最长回文子串

一、题目

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:

输入: “cbbd”
输出: “bb”

二、题目分析

首先通过两次遍历字符串,将字符进行相互比较,同时判断是否为最长的子串,当为最长的子串时,进行的赋值。

三、python3代码

(1)第一次尝试

class Solution:
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        temp1=''
        numax=0
        for i in range(len(s)):
            for j in range(len(s)):
                if (s[i] == s[j]):
                    if ((j-i+1)>numax):
                        numax = j-i+1
                        temp1=''
                        for k in range(i,j+1):
                            temp1 = temp1 + s[k]
        return temp1

报错结果:

输入:
"abcda"
输出:
"abcda"
预期:
"a"

目前还没看出来为啥错了,希望评论解答一下,谢谢!
(2)参考答案

class Solution:
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        # 使用动态规划,用空间换时间,把问题拆分
        # 获取字符串s的长度
        str_length = len(s)
        # 记录最大字符串长度
        max_length = 0
        # 记录位置
        start = 0
        # 循环遍历字符串的每一个字符
        for i in range(str_length):
            # 如果当前循环次数-当前最大长度大于等于1  并  字符串[当前循环次数-当前最大长度-1:当前循环次数+1]  == 取反后字符串
            if i - max_length >= 1 and s[i-max_length-1: i+1] == s[i-max_length-1: i+1][::-1]:
                # 记录当前开始位置
                start = i - max_length - 1
                # 取字符串最小长度为2,所以+=2,s[i-max_length-1: i+1]
                max_length += 2
                continue
            # 如果当前循环次数-当前最大长度大于等于0  并  字符串[当前循环次数-当前最大长度:当前循环次数+1]  == 取反后字符串
            if i - max_length >= 0 and s[i-max_length: i+1] == s[i-max_length: i+1][::-1]:
                start = i - max_length
                # 取字符串最小长度为1,所以+=1,s[i-max_length: i+1]
                max_length += 1
        # 返回最长回文子串
        return s[start: start + max_length]

你可能感兴趣的:(LeetCode)