当前位置: 首页 > 知识库问答 >
问题:

这两种解决方案的时间复杂性是什么?

洪德寿
2023-03-14

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

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

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

我尝试了多种方法,根据我的说法,这两种方法的复杂性都为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 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 = ''
                for k in range(len(t)-1, -1, -1):
                    reverse_t += t[k]
                if t == reverse_t:
                    count += 1
        return count

这两种算法中唯一的变化是,第一种算法使用Python切片来反转字符串,第二种算法使用for循环。切片的时间复杂度是O(K),其中K是切片的长度

共有1个答案

糜征
2023-03-14

您写道:

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)
 类似资料:
  • 给定一个整数数组nums,查找具有最大和的相邻子数组(至少包含一个数字)并返回其和。 示例:

  • 本文向大家介绍详解SpringMVC解决跨域的两种方案,包括了详解SpringMVC解决跨域的两种方案的使用技巧和注意事项,需要的朋友参考一下 1. 什么是跨域 跨域,即跨站HTTP请求(Cross-site HTTP request),指发起请求的资源所在域不同于请求指向资源所在域的HTTP请求。 2. 跨域的应用情景 当使用前后端分离,后端主导的开发方式进行前后端协作开发时,常常有如下情景:

  • 我是复杂性分析新手。任务是给定一个非空字符串(如“Code”)返回一个字符串(如“CCoCodCode”)。我有两个程序在做同样的事情。 程序1: 所以,上面的一个非常简单,这个程序有O(n^2)复杂度。 程序2: 从另一个StackOverflow问题来看,的时间复杂度似乎为O(n)。在这种情况下,程序2也具有O(n^2)时间复杂度。 我的分析是正确的还是遗漏了什么?

  • 关于嵌套for循环的时间复杂性,,我遇到过几篇帖子。它是否仍然适用于我在下面提到的两种情况? 案例1:Second for循环的增量不是1,而是每次迭代都乘以2 案例2:第二个循环以开始,每次迭代递增1。 在这两种情况下,都是一个整数。我认为这两种情况下的时间复杂度都是。这就是实际的时间复杂性吗?

  • 这是hackerrank(https://www.hackerrank.com/challenges/coin-change)的硬币更换问题。它要求计算使用给定面值的硬币对N进行更改的方法总数。 例如,有四种方法可以使用面额为1、2和3的硬币兑换4。它们是-

  • 我已经阅读了这么多的资源,但仍然无法理解什么是时间复杂性。我阅读的参考资料基于各种公式,我理解用于表示时间复杂性,但我不知道如何表示。谁能请解释这个原则,以一个可以理解的明确的方式请给我。