【问题标题】:Find the longest repeated substring in a group of strings找出一组字符串中最长的重复子串
【发布时间】:2013-02-21 21:55:12
【问题描述】:

我正在尝试找到一种方法来找到一组字符串中最大的重复子字符串。 longest duplicate substring problem 通常适用于单个字符串,而不是一组字符串。什么类型的算法可用于在一组字符串中查找最大的重复子字符串?

在一组文件中查找最大的重复字符串(以删除大型软件库中的重复代码)是我想到的主要用例,但该算法也有许多其他用例。

例如,我想在这组字符串中找到最长的重复子字符串:

"Hello world, this is the first string."
"Hello to the world, this is the second string."
"Hello world.  This is the third string."
"This is the third string."

在这种情况下,"This is the third string." 将是最长的重复字符串(即出现在多个这些字符串中的最长字符串)。

【问题讨论】:

  • 一种可能的方法是为每个字符串生成一个分隔符,并将每个字符串连接成一个字符串,分隔符位于每个字符串之间。分隔符需要是在任何现有字符串中都找不到的字符串。然后我可以使用相同的算法来查找单个字符串的最长重复子字符串。
  • @Andy 为什么,你好!在 SMC 玩得开心,是吗? ;) 无论如何,我很确定如果你只是连接字符串然后应用原始算法,你可能会有更好的运气。
  • 虽然,您可能希望首先标记您的输入,而不是逐个字符地查看。取决于你如何实现它,它可以大大加快整体实现速度。
  • 后缀树/后缀数组。
  • 其实his is the 是所有字符串中最长的子串,后面跟string.

标签: algorithm substring


【解决方案1】:

也许this 是您正在寻找的,但您需要将算法应用于两个以上的字符串。如果您考虑一下,这并不难。另外,请查看this page。使用回溯不是一个好主意。

【讨论】:

  • 我有点困惑——你指的是什么类型的回溯?
  • @AndersonGreen 您可以通过回溯来实现,例如递归。但这可能是你能做的最低效的事情,如果你有很多或很长的字符串,你可以去睡觉,希望它会在你醒来之前完成。在链接中查看 LCS 和 LC 字符串问题。应该会有所帮助。此外,simplecoder 的 Suffix Array DataStructure 将为您提供帮助
【解决方案2】:

您的问题的答案从第 60 张幻灯片开始 Click here

基本上,我们列出了字符串输入的所有可能后缀(线性时间)。对它们进行排序(NLogN),并通过排序列表找到最长的(线性时间)

【讨论】:

    【解决方案3】:
    1. 为每个字符串创建一个Trie data structure(又名前缀树)
      • 我们称它为T(i) 字符串i
    2. 使用键string 和值int 创建一个空哈希映射
      • 我们称之为M
    3. 对于每个Trie T(i),对于T(i) 中的每个节点P(其中P 是前缀字符串),
      • 如果键P已经在M中,则递增M[P]
      • 否则,插入M[P] = 1
    4. M 中找到(P*,C*) 对,这样:
      • C* >= 2 (*)
      • length(P*) 是所有此类对中的最大值
    5. P* 是你想要的字符串

    (*) 如果您想获得字符串中K 共有的最长子字符串,您可以将2 替换为K

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      • 2016-08-11
      • 2020-11-08
      相关资源
      最近更新 更多