[leetcode: Python]5.Longest Palindromic Substring

题目:
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example:

Input: "babad"

Output: "bab"

Note: "aba" is also a valid answer.

Example:

Input: "cbbd"

Output: "bb"

题意分析:
这道题目是输入一段不超过1000的字符串,输出最长的回文子字符串,输入的字符串有一个唯一的最长回文子字符串(个人觉得这个没什么用,还限制了一些输入,比如长度为2的时候肯定就只能输入两个相同的字符,还不如改为有同样长度的输出第一个最长回文子字符串,所以该题目我是按照第一个最长回文子字符串)。

题目思路:
题目的字符串长度是1000,如果我们暴力解决,那么构造字符串时间复杂度(O(n2)),判断字符串是不是回文字符串时间复杂度(O(n))总的时间复杂度是(O(n3)),如果暴力解决,那么肯定是会TLE的。

 寻找回文字符串一般有两种方法。第一种是先构造一个字符串,从首尾开始判断是否对应相等。这种方法需要的时间复杂度比较大。第二种方法是从中间往两边找,直到找到两边不一样。这种方法我们要先确定中间的key字符,这里由于当重复字符出现的时候,应该把这些重复的字符捆在一起,因为重复字符出现的时候放中间可以保证满足是回文字符串。比如’'abbbbba’,如果我们将’bbbbb’捆在一起可以减少很多不必要的判断,而且可以避免回文字符串个数为偶数的时候被忽略的情况,比如’abba’。

 那么我们可以初始化回文子字符串为s[0],长度是1,从第一个字符开始往两边找,记录从这个字符为中间字符搜索的回文字符串的长度,如果大于当前记录的回文,那么替换当前的字符串及其长度。从中间找到了最后一位或者以最后一个字符为中间key字符的时候结束。这种方法最坏的情况是’ababababababababa……bac’,这种情况的时间复杂度是(0 + 1 + 2 +…+n - 1) = (O(n^2)),由于字符串长度为1000,所以(O(n^2))的时间复杂度是可以接受的。

方法一:165ms

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        size = len(s)
        if size == 1:
            return s
        if size == 2:
            if s[0] == s[1]:
                return s
            return s[0]
        maxp = 1
        ans = s[0]
        i = 0
        while i < size:
            j = i + 1
            while j < size:
                if s[i] == s[j]:
                    j += 1
                else:
                    break
            k = 0
            while i - k - 1 >= 0 and j + k<= size - 1:
                if s[i- k - 1] != s[j + k]:
                    break
                k += 1
            if j - i + 2*k > maxp:
                maxp = j- i + 2*k
                ans = s[i - k:j + k]
            if j + k == size - 1:
                break
            i = j
        return ans

方法二:82ms

# -*- coding: utf-8 -*-
class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        length=len(s)
        
        if(length<=1 or s==s[::-1]):#如果字符串长度为1直接返回
            return s
        
        start=0
        maxLen=1
        for i in range(0,length):
            ##注意s[1:3]表示的是第2个和第3个char
            if i-maxLen>=1 and s[i-maxLen-1:i+1]==s[i-maxLen-1:i+1][::-1]:
                start=i-maxLen-1
                maxLen+=2
                continue
            if i-maxLen>=0 and s[i-maxLen:i+1]==s[i-maxLen:i+1][::-1]:
                start=i-maxLen
                maxLen+=1
        
        return s[start:start+maxLen]

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值