• [LeetCode]题解(python):005-Longest Palindromic Substring


     

    题目来源:

    https://leetcode.com/problems/longest-palindromic-substring/


    题意分析:

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


    题目思路:

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

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

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


    代码(python):

     1 class Solution(object):
     2     def longestPalindrome(self, s):
     3         """
     4         :type s: str
     5         :rtype: str
     6         """
     7         size = len(s)
     8         if size == 1:
     9             return s
    10         if size == 2:
    11             if s[0] == s[1]:
    12                 return s
    13             return s[0]
    14         maxp = 1
    15         ans = s[0]
    16         i = 0
    17         while i < size:
    18             j = i + 1
    19             while j < size:
    20                 if s[i] == s[j]:
    21                     j += 1
    22                 else:
    23                     break
    24             k = 0
    25             while i - k - 1 >= 0 and j + k<= size - 1:
    26                 if s[i- k - 1] != s[j + k]:
    27                     break
    28                 k += 1
    29             if j - i + 2*k > maxp:
    30                 maxp = j- i + 2*k
    31                 ans = s[i - k:j + k]
    32             if j + k == size - 1:
    33                 break
    34             i = j
    35         return ans
    View Code

    转载请注明出处:http://www.cnblogs.com/chruny/

  • 相关阅读:
    Docker 容器默认root账号运行,很不安全!
    Prometheus阅读目录
    linux修改SSH远程登录端口 服务器安全篇
    linux 部署出现Fatal error: Class 'DOMDocument' not found。
    mysql开启远程访问权限
    linux 重置mysql 密码
    推送(极光推送)
    linux 搭建SVN
    C语言词频统计设计
    读《构建之法》有感
  • 原文地址:https://www.cnblogs.com/chruny/p/4791078.html
Copyright © 2020-2023  润新知