Algorithm 查找一组字符串中最长的重复子字符串

Algorithm 查找一组字符串中最长的重复子字符串,algorithm,substring,Algorithm,Substring,我正试图找到一种方法来找到一组字符串中最大的重复子字符串。通常应用于单个字符串,而不是一组字符串。什么类型的算法对于在一组字符串中查找最大的重复子字符串是有用的 在一组文件中查找最大的重复字符串(以便在大型软件库中删除重复代码)是我想到的主要用例,但该算法还有许多其他用例 例如,我想在这组字符串中找到最长的重复子字符串: "Hello world, this is the first string." "Hello to the world, this is the second string.

我正试图找到一种方法来找到一组字符串中最大的重复子字符串。通常应用于单个字符串,而不是一组字符串。什么类型的算法对于在一组字符串中查找最大的重复子字符串是有用的

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

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

"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."

在这种情况下,
“这是第三个字符串。”
将是最长的重复字符串(即,出现在多个字符串中的最长字符串)。

可能是您正在寻找的,但您需要对两个以上的字符串应用算法。如果你仔细想想,这并不难。另外,看一看。使用回溯不是一个好主意。

您的问题的答案是从幻灯片60开始

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

  • 为每个字符串创建一个(又称前缀树)
    • 让我们称它为字符串
      i
      T(i)
  • 使用key
    string
    和value
    int
    • 我们称之为
      M
  • 对于每个Trie
    T(i)
    ,对于
    T(i)
    中的每个节点
    P
    (其中
    P
    是前缀字符串),
    • 如果键
      P
      已经在
      M
      中,则递增
      M[P]
    • 否则,插入
      M[P]=1
  • M
    中找到
    (P*,C*)
    对,以便:
    • C*>=2
      (*)
    • 长度(P*)
      是所有这类对中的最大值
  • P*
    是您想要的字符串

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

    一种可能的方法是为每个字符串生成一个分隔符,并将每个字符串连接成一个字符串,分隔符位于每个字符串之间。分隔符必须是在任何现有字符串中都找不到的字符串。然后我可以使用与查找单个字符串的最长重复子字符串相同的算法。@Andy Why,您好!在SMC玩得开心,是吗?;)无论如何,我很确定,如果你只是连接字符串,然后应用原始算法,你可能会有更好的运气。不过,你可能想先标记你的输入,以免逐字查找。这取决于你是如何实现的,它可以大大加快整个实现。后缀树/后缀数组。实际上,
    his是所有字符串中最长的子字符串,后跟
    字符串。
    我有点困惑-你指的是什么类型的回溯?@AndersonGreen你可以用回溯来实现,例如递归的。但这可能是你能做的最低效的事情,如果你有很多弦或长弦,你可以去睡觉,希望它能一直持续到你醒来。看看链接中的LCS和LC字符串问题。应该会有帮助。此外,simplecoder的后缀数组数据结构将帮助您