首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在较大的集合中寻找一组重复的字符串

在较大的集合中寻找一组重复的字符串
EN

Stack Overflow用户
提问于 2015-05-09 19:15:15
回答 1查看 68关注 0票数 1

我发现,为了在字符串中甚至在两个字符串之间找到重复的字符模式,建议使用后缀树。我想做的事情有点不同。

我有一个在列表中排序的字符串列表(我的意思是,第二个字符串严格地排在第一个字符串之后,第三个字符串在第二个字符串之后,等等)。我想在整组字符串中找到长度3-7的重复字符串集。对于这个问题,选择的数据结构和算法是什么?

字符串的计数至少为15K (假设最多为30K)。每个字符串的长度约为3-35个字符.

我想要第一个重复子数组中的字符串,以及整个列表中关于子数组重复次数的信息(但是我不需要重复的位置)。

例如:"a“、"b”、"c“、"g”、"h“、"t”、"i“、"a”、"b“、"c”、"z“

在这里,我期待答案"a","b","c“,当我传递时,需要3的重复字符串。这个长度可能从3到7不等。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-09 19:32:47

这会找到第一个中继器,以及它发生的频率:

代码语言:javascript
复制
from collections import Counter
def repeater(strings, k):
    ctr = Counter()
    first = None
    for i in range(len(strings) - k + 1):
        seq = tuple(strings[i:i+k])
        if seq in ctr and first is None:
            first = seq
        ctr[seq] += 1
    return first, ctr.get(first)

seq, ctr = repeater(["a", "b", "c", "g", "h", "t", "i", "a", "b","c", "z", "g", "h", "t"], 3)
if ctr:
    print(seq, 'occurred', ctr, 'times')

指纹:

代码语言:javascript
复制
('a', 'b', 'c') occurred 2 times

一种没有Counter的替代方案

代码语言:javascript
复制
def repeater(strings, k):
    seen = set()
    rep, ctr = None, None
    for i in range(len(strings) - k + 1):
        seq = tuple(strings[i:i+k])
        if rep:
            ctr += seq == rep
        elif seq in seen:
            rep, ctr = seq, 2
        else:
            seen.add(seq)
    return rep, ctr
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30144020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档