检测字符串中的重复

jle*_*and 24 python regex

我有一个简单的问题,但不能带一个简单的解决方案:)

假设我有一个字符串.我想检测一下是否有重复.

我想要:

"blablabla" # => (bla, 3)

"rablabla"  # => (bla, 2)
Run Code Online (Sandbox Code Playgroud)

问题是我不知道我要搜索的模式(我没有"bla"作为输入).

任何的想法?

编辑:
看到评论,我想我应该更多地考虑我的想法:

  • 在字符串中,有一个重复或不重复的模式.
  • 重复的图案可以是任何长度.

如果有一个模式,它将一遍又一遍地重复,直到结束.但是字符串可以在模式的中间结束.

例:

"testblblblblb" # => ("bl",4) 
Run Code Online (Sandbox Code Playgroud)

Tim*_*ker 40

import re
def repetitions(s):
   r = re.compile(r"(.+?)\1+")
   for match in r.finditer(s):
       yield (match.group(1), len(match.group(0))/len(match.group(1)))
Run Code Online (Sandbox Code Playgroud)

使用最短的重复单位找到所有非重叠的重复匹配:

>>> list(repetitions("blablabla"))
[('bla', 3)]
>>> list(repetitions("rablabla"))
[('abl', 2)]
>>> list(repetitions("aaaaa"))
[('a', 5)]
>>> list(repetitions("aaaaablablabla"))
[('a', 5), ('bla', 3)]
Run Code Online (Sandbox Code Playgroud)

  • 这不是**O**n!?我认为这很恶劣,因为这种简单构造的潜在计算成本. (3认同)
  • 在没有重复的字符串中,它必须找到**所有**非空子串.那是n!? (3认同)
  • @TimPietzcker:我认为你的担忧是正确的,但措辞太弱了.IIRC,**没有**"解决方案不会遇到这个问题".换句话说,我认为这个问题是经典的**O**(n!)错误,并且没有合理的算法. (3认同)
  • 有些人在面对问题时会想到"我知道,我会使用正则表达式."现在他们有......一个非常好的解决方案. (2认同)
  • @S.Lott 是的,[有](http://digitool.library.colostate.edu///exlibris/dtl/d3_1/apache_media/L2V4bGlicmlzL2R0bC9kM18xL2FwYWNoZV9tZWRpYS8xNjY2ODE=.pdf)(`n)(`n) (2认同)
  • Crochemore ( http://scholar.google.com/scholar?cluster=8911547273147713204&hl=en&oi=scholarr ) 于 1981 年有一个 O(n log n) 有更复杂和最近的 O(n) 算法,其中设置非常重(如果我记得,它们基于 Lempel-Ziv 分解)但在千兆字节字符串上工作得很好(想想 DNA)。 (2认同)