我正在处理一个问题,找到给定字符串的完全重复的最短子字符串,如果没有匹配,则返回该字符串的长度。
我的主要想法是从Juliana的答案(Check if string is repetition of an unknown substring)中学到的,我在Python 2.7中重写了算法。
我认为它应该是O(n^2)
,但不相信我是正确的,这是我的想法 - 因为在外部循环中,它尝试使用开始字符迭代的可能性 - 它是{{1}外部循环,在内部循环中,它逐个比较字符 - 它是O(n)
内部比较。那么,总体时间复杂度是O(n)
?如果我不对,请帮助纠正。如果我是对的,请帮忙确认。 :)
输入和输出示例
O(n^2)
我的代码,
catcatcat => 3
aaaaaa=>1
aaaaaba = > 7
答案 0 :(得分:1)
您对重写的运行时间的评估是正确的。
但是Use just the preprocessing of KMP to find the shortest period of a string。
(重写可能更简单:
def shortestPeriod(word):
"""the length of the shortest prefix p of word
such that word is a repetition p
"""
# try prefixes of increasing length
for i in xrange(1, len(word)//2 + 1):
j = i
while word[j] == word[j-i]:
j += 1
if len(word) <= j:
return i
return len(word)
if __name__ == "__main__":
for word in ('catcatcat', 'catcatcatdog',
'abaaba', 'ababbbababbbababbbababbb',
'aaaaab', 'aaaaaa'):
print shortestBase(word)
- 您连续两次将word[0:i]
与word[i:2*i]
进行比较。)