代码之家  ›  专栏  ›  技术社区  ›  snazzybouche

寻找最短的唯一子串

  •  1
  • snazzybouche  · 技术社区  · 6 年前

    我有一个名字和一张名单。我可以保证所选名称包含在其他名称列表中。

    我希望生成所选名称的最短子字符串,该子字符串仅由该名称包含,而不由数据中的任何其他名称包含。

    >>> names = ['smith','jones','williams','brown','wilson','taylor','johnson','white','martin','anderson']
    >>> find_substring('smith', names)
    "sm"
    >>> find_substring('williams', names)
    "ll"
    >>> find_substring('taylor', names)
    "y"
    

    我的问题是,我的名单上有一万多个名字,而且它们相当长——与书名更为相似。野蛮的武力需要 永远 .

    是否有一些简单的方法可以有效地实现这一点?

    0 回复  |  直到 6 年前
        1
  •  1
  •   user11114632 user11114632    6 年前

    ["s":true, "m": true, "sm": false"]
    

    首先查阅此列表将有助于减少检查其他字符串的代码,并加快方法的运行速度。

        2
  •  1
  •   felipe    6 年前

    变型 common suffix tree 可能足以在不到一年的时间内实现这一目标 O(n^2) 时间(在生物信息学中用于大规模基因组测序),但正如@HeapOverflow在评论中提到的,我不认为暴力强迫这个问题会成为一个很大的问题,除非你考虑用几亿个字符串运行算法。

    参考上面的维基百科文章:您可以在 O(n) 时间(所有字符串,而不是单个字符串),并使用它查找所有 z 字符串的出现 P m 在里面 O(m + z) 时间实施正确,您可能会看到 O(n) + O(am + az) = O(am + az) a 单词(欢迎任何人再次检查我的数学)。