我正在解决一个有时间和内存限制的问题,不幸的是,这是时间限制的失败。
我对Python很新,所以对任何有关更快/更好方法的反馈表示赞赏。
这是该计划试图解决的问题:
定义两个字符串A&的相似性。 B作为它们共享的最长公共前缀的长度。即AAAB和AABCAAAB的相似性为2。
程序应输出输入字符串与其所有后缀的相似之和。即对于AAAB,它应该输出
相似性(AAAB,AAAB)+相似性(AAAB,AAB)+相似性(AAAB,AB)+相似性(AAAB,B)= 4 + 2 + 1 + 0 = 7
第一行输入是要输入的字符串数,每个后续行包含要处理的字符串。
from array import array
n = int(sys.stdin.readline())
A = [0] * n #List of answers
for i in range(1,n+1):
string = sys.stdin.readline().strip()
A[i-1] = len(string)
for j in range(1, len(string)):
substr = string[j:len(string)]
sum = 0
for k in range(0, len(substr)):
if substr[k] != string[k]:
break
else:
sum += 1
A[i-1] += sum
for i,d in enumerate(A):
print d
答案 0 :(得分:2)
在性能方面更喜欢xrange,因为它在python2.X中迭代的速度更快但我能给出的最好的建议是使用timeit来衡量改进和改进,同时调整你的算法。
用谷歌搜索了另一个实现:Longest Common substring解决方案,但python-Levenshtein库可能是你最好的选择,因为它有速度的C扩展......
答案 1 :(得分:1)
第一步是减少你正在做的索引量:
import sys
n = int(sys.stdin.readline())
for i in range(n):
string = sys.stdin.readline().strip()
sum = 0
for offset in range(len(string)):
suffix = string[offset:]
for c1, c2 in zip(string, suffix):
if c1 != c2:
break
sum += 1
print sum
但这仍然是O(N ^ 2)。对于O(N),请使用后缀树或数组,例如http://code.google.com/p/pysuffix/
答案 2 :(得分:1)
您可以尝试其他实施
sum(len(os.path.commonprefix([instr,instr[i:]])) for i in xrange(0,len(instr)))
其中instr =你说的字符串