Python leetcode387的时间复杂度
我需要更好地理解时间复杂性,这个特殊的例子似乎让我困惑 问题:(源代码) 给定一个字符串,找到其中的第一个非重复字符并返回其索引。如果它不存在,则返回-1 示例:Python leetcode387的时间复杂度,python,python-3.x,Python,Python 3.x,我需要更好地理解时间复杂性,这个特殊的例子似乎让我困惑 问题:(源代码) 给定一个字符串,找到其中的第一个非重复字符并返回其索引。如果它不存在,则返回-1 示例: s = "leetcode" return 0. s = "loveleetcode", return 2. 注意:您可以假设字符串只包含小写字母 根据我的解决方案,我知道for循环将遍历字符串最坏情况O(n)时间,n是字符串的长度。但是在for循环中,我检查每个字符的计数,我知道count
s = "leetcode"
return 0.
s = "loveleetcode",
return 2.
注意:您可以假设字符串只包含小写字母
根据我的解决方案,我知道for循环将遍历字符串最坏情况O(n)时间,n是字符串的长度。但是在for循环中,我检查每个字符的计数,我知道count()方法本身需要O(n)个时间。那么把它变成一个O(n^2)解?我的逻辑正确吗
我的解决方案:
类解决方案:
def firstUniqChar(自我,s:str)->int:
如果len=0:
返回-1
对于范围(len)中的字符:
如果s.count(s[char])>1:
通过
其他:
返回(字符)
返回(-1)
因此,我的代码适用于较小的测试用例,但是当测试s是一个巨大字符串的用例时,它表示超出了时间限制。我不需要解决这个问题,我只想知道O(n^2)是否是我的代码的实际时间复杂度。是的,这是正确的。对…的
的复杂性。。。len(s)
是O(| s |)
,s.count也是。既然嵌套了它们,那么就有了O(| s | ^2)
您的假设是正确的。实际上,您有两个嵌套循环,在最坏的情况下,每个循环计数为n
,因此n^2
。如果len(set(s))==0
,则len(s)==0
。此外,您的实现是O(n^2),但不一定是。如果您愿意使用O(n)额外的空间,您可以在O(n)时间内完成此操作。@chepner您甚至不需要O(n)
space。你只需要记住前一个字符。额外需要的空间只有O(26):-),一个保存每个字母状态的列表。例如,“abba cd dice”的最终状态可以是[-1,-1,-1,11,0,0,0,9,…]
@Selcuk,仍然是O(N)空格,因为您可能只在字符串的末尾找到一个非重复的