04.找最长回文串-python.md

题目

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

示例:

示例 1:

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

输入: "cbbd"
输出: "bb"
解法一:暴力循环法

      循环三次字符串,每次循环检查的是否是回文串。

示例
class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        # 解法一
        # 最大长度
        max_length = 0
        # 回文串
        palindromic = ''
        # 如果s长度为0或1可以直接返回s
        if len(s) == 1 or len(s) ==0:
            return s
        # 遍历回文串头
        for i in range(len(s)):
            # 遍历回文串尾
            for j in range(i+1, len(s)):
                is_palindromic = True
                for k in range(i, int((i+j)/2)+1):
                    # 检验是否是回文串
                    if s[k] != s[j-k+i]:
                        is_palindromic = False
                        break
                # 如果是回文串且长度比之前的都长
                if is_palindromic and (j-i+1)>max_length:
                    max_length = j-i+1
                    palindromic = s[i: j+1]
        if palindromic == '':
            palindromic = s[0]
        return palindromic
执行结果

时间复杂度太高超出时间限制…
在这里插入图片描述

解法二:中心枚举法

      通过枚举字符串子串的中心而不是起点,向两边同时扩散,依然是逐一判断子串的回文性。这种优化算法比之前第一种算法在最坏的情况下(即只有一种字符的字符串)效率会有很大程度的上升。

示例
class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        # 解法二
        l = len(s)
        max_length = 0
        palindromic = ''
        # 如果s长度为0或1可以直接返回s
        if l == 1 or l == 0:
            return s
        for i in range(l):
            # 回文串长度为奇数
            x = 1
            while (i - x) >= 0 and (i + x) < l:
                if s[i + x] == s[i - x]:
                    x += 1
                else:
                    break
            x -= 1
            if 2 * x + 1 > max_length:
                max_length = 2 * x + 1
                palindromic = s[i - x:i + x + 1]
            # 回文串长度为偶数
            x = 0
            if (i + 1) < l:
                while (i - x) >= 0 and (i + 1 + x) < l:
                    if s[i + 1 + x] == s[i - x]:
                        x += 1
                    else:
                        break
            x -= 1
            if 2 * x + 2 > max_length:
                max_length = 2 * x + 2
                palindromic = s[i - x:i + x + 2]
        if palindromic == '':
            palindromic = s[0]
        return palindromic
执行结果

执行结果

解法三:动态规划法

      这种方法是在网上看到的,采用动态规划的方法,只考虑比原最长回文串长的情况。设原最长回文串为P(j, i),下次循环i +=1,新的最长回文串只可能是P(j-1, i+1)或P(j, i +1),所以只需判断这两种情况即可.

示例
class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        # 解法三
       n = len(s)
        max_length = 0
        start = 0
        for i in range(n):
            # 原回文串的左右两边值相等
            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
                max_length += 2
                continue
            # 原回文串右边加+1还是回文串的情况
            if i - max_length >= 0 and s[i - max_length: i + 1] == s[i - max_length: i + 1][::-1]:
                start = i - max_length
                max_length += 1
        return s[start: start + max_length]
执行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值