string - Hackerrank `super-functional-strings` 因超时而终止

标签 string python-3.x python-2.7 substring

给定一个由小写字母组成的字符串,p,计算函数的总和 F(p) = [len(p)**distinct(p)]%[10**9 + 7] 遍历 F 的所有可能的不同子串。由于结果很大,因此打印它对 10**9 + 7 取模。

例如,对于“aba”,它是:

  • F(a) = 1
  • F(ab) = 4
  • F(aba) = 9
  • F(b) = 1
  • F(ba) = 4

总和等于 19。

以下是我的解决方案:

import os
import sys

def superFunctionalStrings(s):
    a=list()
    thesum=0
    length = len(s) + 1
    modu=10**9 + 7
    for j in range(length):
        for i in range(j+1, length):
            b = s[j:i]
            if b not in a:
                a.append(b)
                thesum += (len(b)**len(set(b)))%(modu)
    summ = thesum%(modu)       
    return(summ)         

我可以做些什么来优化它,以免发生超时? (我猜外部库是不允许的)

最佳答案

你说“不同的子字符串”,所以对于初学者来说,使用一个集合而不是一个列表,这样就不会存储重复的子字符串,这样你就可以获得 O(1) 的查找时间。另外,直到最后才需要模数,并且 Python 支持任意大整数的加法,因此循环内不一定需要模数。最后,我会尝试使用推导式,以便 Python 可以更快地循环。以下是这些建议给您带来的结果:

def superFunctionalStrings(s):
    a=list()
    thesum=0
    length = len(s) + 1
    modu=10**9 + 7
    substrs = {s[j:i] for j in range(length) for i in range(j+1, length)}
    return sum(len(b) ** len(set(b)) for b in substrs) % modu

通过采用这种方法,我的速度提高了约 15-20 倍。

关于string - Hackerrank `super-functional-strings` 因超时而终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50297494/

相关文章:

google-app-engine - 关于在谷歌应用引擎中将 eve 用于 python 框架

python-2.7 - 调用 python-nmap PortScanner(),nmap 未找到

python - 字符串中第二个重复字符的索引

java - 使用 Unicode 文本还是 Unicode 字符串?

python - 遍历迭代器

python - 如何在python中读取从shell脚本导出的变量

python - 我尝试在 Python 2 中使用 Twilio 发送短信

string - 将字符视为变量

java - 字符串文字的垃圾收集

python-3.x - 使用固定装置跳过 pytest 中的测试