当前位置: 首页 > 知识库问答 >
问题:

查找字符串中最重复(不是最常见)序列的算法(又名串联重复)

黄昊英
2023-03-14

我正在寻找一种算法(可能是用Python实现的),能够找到字符串中最重复的序列。其中,对于重复,我指的是不间断地反复重复的任何字符组合(串联重复)。

我正在寻找的算法与“查找最常见的单词”的算法不同。事实上,重复块不需要是字符串中最常见的字(子字符串)。

例如:

s = 'asdfewfUBAUBAUBAUBAUBAasdkBAjnfBAenBAcs'
> f(s)
'UBAUBAUBAUBAUBA' #the "most common word" algo would return 'BA'

不幸的是,我不知道如何解决这个问题。任何帮助都非常欢迎。

更新

有一个额外的例子来说明我希望返回重复次数最多的序列,不管它的基本构造块是什么。

g = 'some noisy spacer'
s = g + 'AB'*5 + g + '_ABCDEF'*2 + g + 'AB'*3
> f(s)
'ABABABABAB' #the one with the most repetitions, not the max len

来自@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.

共有3个答案

厉熠彤
2023-03-14

您要搜索的是一种算法,用于查找字符串中的“最大”原始串联重复。本文描述了一种线性时间算法,用于查找字符串中的所有串联重复,并扩展了所有原始串联重复。古斯菲尔德。用于查找和表示字符串中所有串联重复的线性时间算法

钮高朗
2023-03-14

以下是基于(\w?\2)regex的解决方案,但有其他改进:

import re
from itertools import chain


def repetitive(sequence, rep_min_len=1):
    """Find the most repetitive sequence in a string.

    :param str sequence: string for search
    :param int rep_min_len: minimal length of repetitive substring
    :return the most repetitive substring or None
    """
    greedy, non_greedy = re.compile(r'((\w+)\2+)'), re.compile(r'((\w+?)\2+)')

    all_rep_seach = lambda regex: \
        (regex.search(sequence[shift:]) for shift in range(len(sequence)))

    searched = list(
        res.groups()
        for res in chain(all_rep_seach(greedy), all_rep_seach(non_greedy))
        if res)

    if not sequence:
        return None

    cmp_key = lambda res: res[0].count(res[1]) if len(res[1]) >= rep_min_len else 0
    return max(searched, key=cmp_key)[0]

你可以这样测试它:

def check(seq, expected, rep_min_len=1):
    result = repetitive(seq, rep_min_len)
    print('%s => %s' % (seq, result))
    assert result == expected, expected


check('asdfewfUBAUBAUBAUBAUBAasdkBAjnfBAenBAcs', 'UBAUBAUBAUBAUBA')
check('some noisy spacerABABABABABsome noisy spacer_ABCDEF_ABCDEFsome noisy spacerABABAB', 'ABABABABAB')
check('aaabcabc', 'aaa')
check('aaabcabc', 'abcabc', rep_min_len=2)
check('ababcababc', 'ababcababc')
check('ababcababcababc', 'ababcababcababc')

主要特点:

  1. 使用贪婪((\w)\2)和非贪婪((\w)\2?)正则表达式
  2. 搜索所有子串中的重复子串,并从开头移位(例如'string'=

谭敏学
2023-03-14

通过组合re.findall()(使用特定的regex patten)和max()函数:

import re

#  extended sample string
s = 'asdfewfUBAUBAUBAUBAUBAasdkjnfencsADADADAD sometext'

def find_longest_rep(s):
    result = max(re.findall(r'((\w+?)\2+)', s), key=lambda t: len(t[0]))
    return result[0]

print(find_longest_rep(s))

输出:

UBAUBAUBAUBAUBA

关键模式:

  • ((\w?\2)
    • (..)-最外层的捕获组,即第一个捕获组
    • (\w?——包含在第二个捕获组中的任何非空白字符序列<代码>?-量词,在一次和无限次之间匹配,次数尽可能少,可根据需要扩展
    • \2-与第二个捕获组最近匹配的文本相同

 类似资料:
  • 我需要找到字符串中最长的序列,并警告序列必须重复三次或更多次。例如,如果我的字符串是: fdwaw4helloworld vcdv1c3xcv3xcz1sda21f2sd1ahelloworld gafgfa4564534321fadghelloworld 然后我希望返回值“helloworld”。 我知道有几种方法可以做到这一点,但我面临的问题是,实际的字符串太大了,所以我真的在寻找一种能够及时

  • 如果此问题重复了可用问题,则表示歉意。还没有找到一个正是我要找的。 我感兴趣的是检测字符串/数组中的模式,例如,在这些字符串/数组中,这些模式同样可以用整数编码。我的应用程序是这样的,我正在使用流式传感器,其中上述序列中的每个字母都是一个传感器(例如,是一个传感器)。由于传感器故障等原因,我的序列并不总是非常定期/重复。由于各种故障,它们可能会像这样出现,例如或。 我的应用程序变得更加困难,因为我

  • 我正在寻找一种快速算法,搜索给定字符串中最长的重复子字符串(至少重复1次),并尽可能降低时间复杂度和(如果可能)内存(RAM)。 我见过一些实现,但大多数都不是为大量字符设计的(比如说)。一个例子是: 我已经尝试了100次包含的字符串。 它适用于小弦( 编辑:有没有办法不用在内存中加载一个(比如20GB)文件就可以做到这一点?

  • 我在一个文本文件中有一个长字符串(DNA序列,超过20000个字符),我试图找到其中最长的序列,它至少重复了三次。实现这一目标的最佳方式是什么? 我能找到的唯一现有主题是在两个或多个单独的字符串中查找重复,但是如何使用一个长字符串?

  • 问题内容: 我们给了一个字符串,例如,取“ TUOPPPPJHHTT”。我们希望找出哪个字符在字符串中连续出现次数最多以及发生多少次。在这种情况下,其P发生4次。 我尝试如下运行for循环 但是用这种方法,问题是它将计算所有字母的重复出现。 问题答案: 每次找到与上一个字符不同的字符,则表示运行(连续重复的字母)结束,因此您应记下当前运行的长度(即的值),然后重置计数。最后,您可以打印最大值。

  • 本文向大家介绍Python查找最长不包含重复字符的子字符串算法示例,包括了Python查找最长不包含重复字符的子字符串算法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python查找最长不包含重复字符的子字符串算法。分享给大家供大家参考,具体如下: 题目描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。例如在“arabcacfr”中,最长的不包含重