Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.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_Data Structures_Time Complexity - Fatal编程技术网

Python 这两种解决方案的时间复杂度是多少?

Python 这两种解决方案的时间复杂度是多少?,python,data-structures,time-complexity,Python,Data Structures,Time Complexity,我正在解决这个问题:回文子串。 给定一个字符串,您的任务是计算该字符串中有多少回文子字符串 具有不同开始索引或结束索引的子字符串被计为不同的子字符串,即使它们包含相同的字符 我尝试过多种方法,据我所知,这两种方法的复杂性都是O(N*3)。但是leetcode接受一个解决方案,并超出另一个解决方案的返回时间限制 可接受的解决方案: def countSubstrings(self, s): count = len(s) for i in range(2, len(s

我正在解决这个问题:回文子串。

给定一个字符串,您的任务是计算该字符串中有多少回文子字符串

具有不同开始索引或结束索引的子字符串被计为不同的子字符串,即使它们包含相同的字符

我尝试过多种方法,据我所知,这两种方法的复杂性都是O(N*3)。但是leetcode接受一个解决方案,并超出另一个解决方案的返回时间限制

可接受的解决方案:

def countSubstrings(self, s):
        count = len(s)
        for i in range(2, len(s)+1):
            j = 0
            while(j < len(s) and j+i <= len(s)):
                t = s[j:j+i]
                j = j + 1
                reverse_t = t[::-1]
                if t == reverse_t:
                    count += 1
        return count
def countsubstring(self,s):
计数=len(s)
对于范围(2,len(s)+1)内的i:
j=0
而(j
reverse_t = ''
for k in range(len(t)-1, -1, -1):
    reverse_t += t[k]
由于字符串是不可变的,通过一次添加1个字母来构造字符串效率极低,因为在每次迭代中,您必须构造一个全新的对象。本质上,这是您在计算中没有考虑的字符串串联。逐字母构造长度为n的字符串实际上是
o(n**2)

为了演示这会带来多大的不同,下面是一个简单的设置:

def letter_by_letter_reverse(string):
    reverse_t = ''
    for k in range(len(string)-1, -1, -1):
        reverse_t += string[k]
    return reverse_t

def slice_reverse(string):
    reverse_t = string[::-1]
    return reverse_t

test = 'some_string' * 500

%timeit letter_by_letter_reverse(test)
#1.44 ms ± 204 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit slice_reverse(test)
#8.2 µs ± 56.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
你写道:

reverse_t = ''
for k in range(len(t)-1, -1, -1):
    reverse_t += t[k]
由于字符串是不可变的,通过一次添加1个字母来构造字符串效率极低,因为在每次迭代中,您必须构造一个全新的对象。本质上,这是您在计算中没有考虑的字符串串联。逐字母构造长度为n的字符串实际上是
o(n**2)

为了演示这会带来多大的不同,下面是一个简单的设置:

def letter_by_letter_reverse(string):
    reverse_t = ''
    for k in range(len(string)-1, -1, -1):
        reverse_t += string[k]
    return reverse_t

def slice_reverse(string):
    reverse_t = string[::-1]
    return reverse_t

test = 'some_string' * 500

%timeit letter_by_letter_reverse(test)
#1.44 ms ± 204 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit slice_reverse(test)
#8.2 µs ± 56.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

我认为这项任务不需要任何临时字符串就可以完成。你还可以得到一个更简单、更快的算法。我可以为你编写这个算法,但你不会学到任何东西。而且你的第一个算法甚至不起作用。你正在将找到的回文数添加到输入字符串的长度中。我认为这项任务应该没有任何临时字符串是可能的。你也会得到一个更简单、更快的算法。我可以为你编写这个算法,但你不会学到任何东西。而且你的第一个算法甚至不起作用。你正在将找到的回文数加到输入字符串的长度上。