我正在寻找一种方法来测试给定的字符串是否在整个字符串中重复.

例如:

[
    '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个或更多字符,因此在每个字符之间循环try 构建一个模式,然后判断模式与字符串的其余部分似乎非常慢.将其乘以可能的数百个字符串,我看不到任何直观的解决方案.

我已经研究了一些正则表达式,当你知道你在寻找什么,或者至少知道你在寻找的模式的长度时,它们似乎很适合.不幸的是,我两个都不知道.

如何判断字符串是否在重复自身,如果是,最短的重复子序列是什么?

推荐答案

下面是一个简洁的解决方案,它避免了正则表达式,并且在Python循环中运行缓慢:

def principal_period(s):
    i = (s+s).find(s, 1, -1)
    return None if i == -1 else s[:i]

有关基准测试结果,请参见@davidism发起的Community Wiki answer项测试.总之,

David Zhang的解决方案显然是赢家,在大型示例集上,其表现至少比其他所有方案高出5倍.

(那是我的回答,不是我的.)

这是基于这样一个观察:弦是周期的,当且仅当它等于自身的非平凡旋转.感谢@AleksiTorhamo意识到我们可以从(s+s)[1:-1]中第一次出现的s的索引中恢复主周期,并通知我Python的string.find的可选startend参数.

Python相关问答推荐

替换字符串中的点/逗号,以便可以将其转换为浮动

如何在PIL、Python中对图像应用彩色面膜?

如何让 turtle 通过点击和拖动来绘制?

根据条件将新值添加到下面的行或下面新创建的行中

Pandas 在最近的日期合并,考虑到破产

SQLGory-file包FilField不允许提供自定义文件名,自动将文件保存为未命名

处理带有间隙(空)的duckDB上的重复副本并有效填充它们

PyQt5,如何使每个对象的 colored颜色 不同?'

如何调整QscrollArea以正确显示内部正在变化的Qgridlayout?

DataFrames与NaN的条件乘法

从嵌套的yaml创建一个嵌套字符串,后面跟着点

通过ManyToMany字段与Through在Django Admin中过滤

* 动态地 * 修饰Python中的递归函数

未调用自定义JSON编码器

手动设置seborn/matplotlib散点图连续变量图例中显示的值

Flask运行时无法在Python中打印到控制台

Polars map_使用多处理对UDF进行批处理

为什么t sns.barplot图例不显示所有值?'

用fft计算指数复和代替求和来模拟衍射?

Scipy差分进化:如何传递矩阵作为参数进行优化?