【发布时间】:2012-11-19 23:56:56
【问题描述】:
我有一串 0 和 1。将“连续双精度”定义为立即重复的子字符串。例如字符串“011101010101110”可以分解为“011 1010 1010 1110”,可以压缩为“011(1010)1110”。
有没有一种很好的算法来查找字符串中的所有连续双精度数?我能想到的最好的结果是字符串长度的二次方:
def all_contiguous_doubles(s):
for j in range(len(s)):
for i in range(j):
if s[i:j] == s[j:2*j - i]:
print "%s(%s)%s" % (s[:i], s[i:j], s[2*j - i:])
【问题讨论】:
-
可以有很多个二次方。考虑字符串“111...111”
-
在任何类型的字符串搜索中避免二次行为的方法是跳过前缀。但这在只有两个字符值的字符串中用处不大,因此它可能是一个糟糕的权衡。
-
每个四位字符串至少包含一个双精度数,因此在任何长度为 n 的零和一字符串中总是至少有
n/4双精度数。 -
你可以让正则表达式引擎为你找到从某个位置开始的最长双精度的脏活:
/(.+)$1/ -
@wye.bee 如果您愿意牺牲代码简单性来换取性能,请构建后缀树并选择最深的分支。
标签: python algorithm substring