搜索两个字符串中最长的子字符串

时间:2014-04-19 07:53:36

标签: c algorithm

任务是:找到两行中找到的最长子串。问题的特点是这些行很长(文件的内容,即每个400,000个字符),以及由短4个字符组成的字母。

字符串可以有不同的长度。

我发明并实现了以下算法:

  1. 要获取第一个文件的内容并写入字符串str1,删除换行符

  2. 要获取第二个文件的内容并写入字符串str2,删除换行符

  3. 我们将所有子串都视为字符串str1,从最长到最短。为此,在每次迭代时定义循环,同时(i> 0),在主内容减少字符串的长度一之后。所以长度为1的字符串。

  4. 在while循环中:长度为N的所有子字符串仅在起始位置不同。

  5. 设一个长度为N的字符串:

    • 它是一个长度为N的子字符串,包含从0开始。

    • 有两个长度为N-1的子字符串,从0和1位置开始

    • 用于三个长度为N-2的子串,从0,1和2位开始

    ...

    • 长度为N-K的K + 1个子串,从位置0,1,...,K
    • 开始

    for循环中计数的起始位置(z = 0; z< = g-i; z ++),其中函数被称为getSubstring接收子字符串。然后使用字符串str2

    的子字符串运行标准函数strstr

    但是这个算法足够长。有没有办法让它更快?

    P.S。用C语言写

1 个答案:

答案 0 :(得分:2)

至少有两个经典选项可以有效地解决最长公共子串

  • 构建两个字符串的通用suffix array或后缀树。可以证明LCS是后缀数组中具有不同颜色(属于不同字符串)的两个相邻后缀的前缀。 I once wrote an answer描述了一个简单的O(n log n)后缀数组构造算法
  • 构建一个字符串的后缀自动机,并将另一个字符串输入其中。在每一点上都要检查" deep"你在自动机中并报告所有深度的最大值。您可以在我的GitHub中find a C++ implementation