[leetcode-python]最长回文子串

题目:给你一个字符串 s,找到 s 中最长的回文子串

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

提示:

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

方案一:循环找

使用两个循环语句,第一个循环找回字文长度,第二个循环寻找回字文开头

class Solution:
    def longestPalindrome(self, s: str) -> str:
        def isPalindrome(st:str):
            #判断是否是回文字串
            num = round(len(st)/2)
            endS = -1
            for starS in range(num):
                if st[starS] != st[endS]:
                    return False
                endS = endS -1
            return True
        if isPalindrome(s):
            return s
        elif len(s) <= 1:
            return s[0]
        elif  len(s) == 2:
            if isPalindrome(s):
                return s
            else :
                return s[0]
        else:    
            lengthMax = 0        
            PalindromeLong = ''####最长的字符串
            for length in range(len(s)+1):
                ####计算字符串长度
                for starS in range(0,len(s)-length):
                    if isPalindrome(s[starS:starS + length + 1]):
                        if length > lengthMax:
                            lengthMax = length
                            PalindromeLong = s[starS:starS + length + 1]

            if PalindromeLong == '':
                PalindromeLong = s[0]
            return PalindromeLong

方案二:中心开花战略

顾名思义就是确定中心后,向两边搜索

class Solution:
    def longestPalindrome(self, s: str) -> str:
        def expand(s,left,right):
            ###拓展两边,判断两边字符是否一致
            while left >= 0 and right < len(s) and s[left] == s[right]:
                left = left - 1
                right = right + 1
            ###结束运行后,新的left 和right 已经不能满足条件了,所以left +1,right因为开闭口问题多取一位
            return left+1,right





        Palindrome = ''
        lengthMAX = 0
        for minN in range(len(s)):
            ##两种情况,单数和双数需要分开讨论
            ##单数 需要中间一个开始数字双边
            leftN1,rightN1 = expand(s,minN,minN)
            ##双数 需要中间两个开始数字双边
            leftN2,rightN2 = expand(s,minN,minN+1)
            if rightN1 - leftN1 > rightN2 - leftN2:
                xxx = s[leftN1 : rightN1]
            else :
                xxx = s[leftN2 : rightN2]
            if len(xxx) > lengthMAX:
                Palindrome = xxx
                lengthMAX = len(xxx)
        return Palindrome

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值