【发布时间】:2015-06-11 10:19:17
【问题描述】:
我正在寻找一种方法来测试给定字符串是否在整个字符串中重复。
例子:
[
'0045662100456621004566210045662100456621', # '00456621'
'0072992700729927007299270072992700729927', # '00729927'
'001443001443001443001443001443001443001443', # '001443'
'037037037037037037037037037037037037037037037', # '037'
'047619047619047619047619047619047619047619', # '047619'
'002457002457002457002457002457002457002457', # '002457'
'001221001221001221001221001221001221001221', # '001221'
'001230012300123001230012300123001230012300123', # '00123'
'0013947001394700139470013947001394700139470013947', # '0013947'
'001001001001001001001001001001001001001001001001001', # '001'
'001406469760900140646976090014064697609', # '0014064697609'
]
是重复自己的字符串,并且
[
'004608294930875576036866359447',
'00469483568075117370892018779342723',
'004739336492890995260663507109',
'001508295625942684766214177978883861236802413273',
'007518796992481203',
'0071942446043165467625899280575539568345323741',
'0434782608695652173913',
'0344827586206896551724137931',
'002481389578163771712158808933',
'002932551319648093841642228739',
'0035587188612099644128113879',
'003484320557491289198606271777',
'00115074798619102416570771',
]
是那些没有的例子。
我给出的字符串的重复部分可能很长,字符串本身可以是 500 个或更多字符,因此循环遍历每个字符以尝试构建模式,然后检查模式与字符串的其余部分似乎慢得可怕。将其乘以可能有数百个字符串,我看不到任何直观的解决方案。
我已经对正则表达式进行了一些研究,当您知道要查找的内容或至少要查找的模式的长度时,它们似乎很有用。不幸的是,我都不知道。
如何判断一个字符串是否在重复,如果是,最短的重复子序列是什么?
【问题讨论】:
-
遍历每个字符以尝试构建一个模式,然后检查该模式与字符串的其余部分似乎非常慢 - 但真的吗?
-
@AvinashRaj 这只是匹配字符串的一部分,而不是全部内容。
-
@AvinashRaj OP 正在询问所有可能的解决方案。您链接到的问题仅接受 regex 解决方案。请注意,正则表达式可能能够解决问题,但需要更多 的时间。例如,最佳解决方案(即线性时间)将使用文本的后缀树。您只需要找到最长的重复子字符串并检查长度即可。
-
@TigerhawkT3 真实数据集太大且笨重,但问题中的示例是其中的一部分,如果您愿意,here's some more。
标签: python string pattern-matching