我正在寻找一个算法(可能是用Python实现的),能够找到字符串中最重复的序列。其中,对于重复,我指的是不间断地反复重复的任何字符组合(串联重复)。在
我要寻找的算法与“查找最常见的单词”不同。事实上,重复块不需要是字符串中最常见的单词(子字符串)。在
例如:
s = 'asdfewfUBAUBAUBAUBAUBAasdkBAjnfBAenBAcs'
> f(s)
'UBAUBAUBAUBAUBA' #the "most common word" algo would return 'BA'
不幸的是,我不知道如何解决这个问题。任何帮助都是非常欢迎的。在
更新
一个额外的例子来说明我希望返回重复次数最多的序列,不管它的基本构建块是什么。在
^{pr2}$@rici中的示例:
s = 'aaabcabc'
> f(s)
'abcabc'
s = 'ababcababc'
> f(s)
'ababcababc' #'abab' would also be a solution here
# since it is repeated 2 times in a row as 'ababcababc'.
# The proper algorithm would return both solutions.
你要寻找的是一种算法,可以在一个字符串中找到“最大”的基元串联重复。本文描述了一个线性时间算法来寻找字符串中的所有串联重复,并通过扩展找到所有原始串联重复。Gusfield. Linear Time Algorithms for Finding and Representing all Tandem Repeats in a String
结合
re.findall()
(使用特定的regex模式)和max()
函数:输出:
^{pr2}$关键模式:
((\w+?)\2+)
:(....)
-最外层的捕获组,即第一个捕获组(\w+?)
-包含在第二个捕获组中的任何非空白字符序列;+?
-量词,匹配次数在一次和无限次之间,尽可能少的次数,根据需要扩展\2+
-匹配第二个捕获组最近匹配的文本以下是基于
((\w+?)\2+)
regex的解决方案,但有其他改进:你可以这样测试:
^{pr2}$主要特点:
((\w+)\2+)
和非贪心((\w+)\2+?)
正则表达式相关问题 更多 >
编程相关推荐