检查一个集合是否包含在另一个集合中的时间复杂度

时间:2020-04-11 01:57:55

标签: python-3.x set sliding-window

我正在尝试实现以下示例:查找包含模式s的给定字符串char的最短子字符串。我的代码工作正常,但是我的目标是达到O(N)的时间复杂度,其中N是s的长度。 这是我的代码;

def shortest_subtstring(s,char):
#smallest substring containing char.use sliding window
start=0
d=defaultdict(int)
minimum=9999
for i in range(len(s)):
    d[s[i]]+=1
    #check whether all the characters from char has been visited.
    while set(char).issubset(set([j for j in d if d[j]>0])):
        #if yes, can we make it shorter

        length=i-start+1
        minimum=min(length,minimum)
        if length==minimum:
            s1=s[start:i+1]
        d[s[start]]-=1
        start+=1
return (minimum,s1)

我的问题已经解决;

 while set(char).issubset(set([j for j in d if d[j]>0]))

每次我都使用char的概念检查is.subset的所有字符串是否都保存在字典中。我可以知道如何在代码中找到此步骤的时间复杂度吗?是否是O(1),对于检查元素是否存在于集合中是否正确。否则,时间复杂度将远远大于O(N)。感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

Per docs s.issubset(t)等效于s <= t,这意味着在操作期间它将测试s中的每个元素是否都在t中。

最佳方案: 如果s是t的第一个元素-> O(1)

最坏情况: 如果s在t的最后一个元素中-> O(len(t))

这是针对isubset的。对于列表理解:

j for j in d是O(n),用于获取每个密钥

if d[j]>0为O(n),用于比较字典d的每个值

Here,您可以找到更多信息。