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

时间:2013-03-06 21:44:39

标签: algorithm substring

我正在尝试找到一种方法来查找一组字符串中最大的重复子字符串。 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."将是最长的重复字符串(即,在多个字符串中出现的最长字符串)。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

  1. 为每个字符串创建一个Trie data structure(a.k.a。前缀树)
    • 我们称之为T(i)字符串i
  2. 使用键string和值int创建一个空哈希映射
    • 我们称之为M
  3. 对于每个Trie T(i)P中的每个节点P(其中T(i)是前缀字符串),
    • 如果密钥P已在M中,则增加M[P]
    • else,插入M[P] = 1
  4. (P*,C*)中找到M对,以便:
    • C* >= 2(*)
    • length(P*)在所有此类对中最大
  5. P*是您想要的字符串
  6. (*)如果您希望获得字符串K共有的最长子字符串,则应将2替换为K