for循环中str.count和str.index的时间复杂度是多少

时间:2019-08-15 16:42:23

标签: python algorithm time-complexity big-o

我正在学习算法的时间复杂度。我不知道为什么下面的代码具有O(n)的时间复杂度。

这是来自解决leetcode问题https://leetcode.com/problems/first-unique-character-in-a-string/discuss/86351/Python-3-lines-beats-100-(~-60ms)-的解决方案!

def firstUniqChar(self, s):
        """
        :type s: str
        :rtype: int
        """

        letters='abcdefghijklmnopqrstuvwxyz'
        index=[s.index(le) for le in letters if s.count(le) == 1]
        return min(index) if len(index) > 0 else -1

我认为该算法具有O(n ^ 2),这是我的逻辑:

对于le中的每个letters,我们需要计算le从头到尾出现在letters中的时间,然后找到{ le中的{1}}从头到尾。

我们基本上遍历letters,即O(n)。对于每次迭代,我们都在做letters(也就是O(n))和count(也都是O(n))。因此,它应该是O(迭代)*(O(计数)+ O(索引))= O(n)*(O(n)+ O(n))= O(2n ^ 2)=> O(n ^ 2)

我的逻辑怎么了?

编辑:

我想我知道我的逻辑出了什么问题。 index只有26个字母,因此是固定时间。

1 个答案:

答案 0 :(得分:5)

Letters的大小恒定。发生变化的是 s

index = []
for le in letters: # O(1)
  if s.count(le) == 1: # count is O(n)
    index.push(s.index(le)) # index is O(n)

实际上是O(2n)或O(n)。