Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 最长回文子串超时错误_Python_String_Algorithm_Dynamic Programming_Greedy - Fatal编程技术网

Python 最长回文子串超时错误

Python 最长回文子串超时错误,python,string,algorithm,dynamic-programming,greedy,Python,String,Algorithm,Dynamic Programming,Greedy,这就是leetcode问题: 给定一个字符串s,查找s中最长的回文子字符串。您可以假定s的最大长度为1000。 我的解决方案是使用dp表 dp[i][j]=以s[i]开始并以s[j]结束的最长回文子串的长度 def longestPalindrome(self, s): """ :type s: str :rtype: str """ from collections import defaultdict dp = defaultdict(lamb

这就是leetcode问题: 给定一个字符串s,查找s中最长的回文子字符串。您可以假定s的最大长度为1000。 我的解决方案是使用dp表 dp[i][j]=以s[i]开始并以s[j]结束的最长回文子串的长度

def longestPalindrome(self, s):
    """
    :type s: str
    :rtype: str
    """
    from collections import defaultdict
    dp = defaultdict(lambda: defaultdict(int))

    for i in range(len(s)):
        dp[i][i] = 1

    for i in range(len(s)):
        for j in range(i):
            dp[i][j] = 0

    for i in range(len(s)-2,-1,-1):
        for j in range(i+1,len(s)):
            # print i,j
            if s[i] == s[j]:
                if dp[i+1][j-1] != 0 or (dp[i+1][j-1] == 0 and i+1 == j):
                    dp[i][j] = dp[i+1][j-1] + 2
            else:
                dp[i][j] = 0
    ma = 0
    for i in dp:
        for j in dp[i]:
            ma = max(ma,dp[i][j])
    for i in dp:
        for j in dp[i]:
            if ma == dp[i][j]:
                return s[i:j+1]

我想知道为什么我的解决方案超过了时间限制错误,是不是应该是O(n^2)?

您的程序很慢,因为您使用的是dict而不是仅仅使用列表。理论上,dict的检索时间是O(1),但实际上要慢得多。通过删除dict和不必要的循环,我们能够显著提高程序的速度

    import datetime

    dp = []
    s = "2002102312021431021040231111020201133311233024421042231304121241020023142221114230004301243314231230214433111214211314133411004342320014022213111042430444004404311314414200241443301440042103234032030121140001041102303330110233133340432134433210112441424442023312122012402303012311424320243021030201004404000233341240024023144124044404302020410204423323302241442333033201414131324123134403044304322144401024224303321214233130212433144203342422324100041134301121132222001220203130411024402234004321003440112131342041403304201333110022003023302203024304401002123122342411442214213321413143300334244430320213112244342103103204123233312034020241340322132002141410211130244413124101114032043134121044210134141023134243114420112213332140001323102023014003011402012421443222032402233333402044010204113132440133331131221102004121233103312123433211331411321403124131442401414233311420022322231312101043131324112421403332220423134430421023401314111414244401032422411033440022130241432302100314102230341313003040"
    print(datetime.datetime.now().strftime('%S.%f')[:-3])
    for i in range(len(s)+1):
        new =[]
        for j in range(len(s)+1):
            if i==j:
                new.append(1)
            else:
                new.append(0)
        dp.append(new)

    ma = 0
    res=""

    for i in range(len(s) - 2, -1, -1):
        for j in range(i + 1, len(s)):
            if s[i] == s[j]:
                if dp[i + 1][j - 1] != 0 or (dp[i + 1][j - 1] == 0 and i + 1 == j):
                    dp[i][j] = dp[i + 1][j - 1] + 2
                    if ma < dp[i][j]:
                        ma = dp[i][j]
                        res = s[i:j + 1]
            elif i != j:
                dp[i][j] = 0

    print(res)
    print(datetime.datetime.now().strftime('%S.%f')[:-3])
导入日期时间
dp=[]
s="2002102312021431021040231111020201133311233024421042231304121241020023142221114230004301243314231230214433111214211314133411004342320014022213111042430444004404311314414200241443301440042103234032030121140001041102303330110233133340432134433210112441424442023312122012402303012311424320243021030201004404000233341240024023144124044404302020410204423323302241442333033201414131324123134403044304322144401024224303321214233130212433144203342422324100041134301121132222001220203130411024402234004321003440112131342041403304201333110022003023302203024304401002123122342411442214213321413143300334244430320213112244342103103204123233312034020241340322132002141410211130244413124101114032043134121044210134141023134243114420112213332140001323102023014003011402012421443222032402233333402044010204113132440133331131221102004121233103312123433211331411321403124131442401414233311420022322231312101043131324112421403332220423134430421023401314111414244401032422411033440022130241432302100314102230341313003040"
打印(datetime.datetime.now().strftime(“%S.%f”)[:-3])
对于范围内的i(透镜+1):
新=[]
对于范围内的j(透镜+1):
如果i==j:
新增。追加(1)
其他:
新增。追加(0)
dp.追加(新)
ma=0
res=“”
对于范围内的i(len(s)-2,-1,-1):
对于范围(i+1,len(s))内的j:
如果s[i]==s[j]:
如果dp[i+1][j-1]!=0或(dp[i+1][j-1]==0且i+1==j):
dp[i][j]=dp[i+1][j-1]+2
如果ma

这是更快的版本。在本例中,我使用了随机生成的1000个字符长的字符串。您的原始程序在我的计算机上完成此操作大约需要2秒,而优化的程序只需要1秒。

什么是“TLE错误”?“除非是行业标准的TLA,否则不要假设人们知道你在说什么。抱歉,超过了时间限制。它非常接近O(N^2)。可能是python的速度太慢了。