Python3.x - 使用字典计算所有子字符串的出现次数

时间:2015-06-19 19:47:01

标签: python-3.x substring

给定一些字符串S,此代码将计算字符串S的所有可能子串的出现次数。

#count[i]=no of different substrings in the string that occurs exactly i times
count=[0]*(100001)
a=input()
dic={}
n=len(a)
for i in range(n):
    temp=""
    for j in range(i,n,1):
        temp+=a[j]
        if temp in dic:
            dic[temp]+=1
        else:
            dic[temp]=1
for k,v in dic.items():
    count[v]+=1

例如,对于字符串“ababa”,数组将为:

  • cnt [1] = 4 {“ababa”,“abab”,“baba”,“bab”}恰好出现一次
  • cnt [2] = 4 {“aba”,“ab”,“ba”,“b”}恰好出现两次
  • cnt [3] = 1 {“a”}恰好发生三次
  • cnt [4] = 0
  • CNT [5] = 0

我有兴趣知道我的代码的运行时间

1 个答案:

答案 0 :(得分:0)

您的代码基本上有两部分需要单独考虑:

  1. 构建`dic`。
  2. 的嵌套循环
  3. 构建`count`。
  4. 的循环

    对于1。有两个循环需要考虑。 i循环将运行n次,j循环每次运行n-i次。

    这意味着j循环将第一次运行n次,第二次运行n-1次,依此类推,直到i = n-1运行一次为止。因此,该块的总运行时间为n(n + 1)/ 2,即O(n ^ 2)。

    (注意:我假设字典访问需要恒定时间,大多数情况下都是如此)。

    For 2。只有一个循环需要考虑哪些循环存在多少次。对于长度为n的字符串,唯一子串的最大数量也是n(n + 1)/ 2,也是O(n ^ 2)。

    因此,运行时间为O(n ^ 2)。对于n = 10e5,操作次数为~10e10,大约需要10秒,使用10e9操作需要1秒的标准假设。