繁体   English   中英

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

[英]Search the longest substring in two strings

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

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

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

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

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

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

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

让我们有一个长度为N的字符串:

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

  • 有两个长度为N-1的子串在位置0和1之间开始

  • 在它中有三个长度为N-2的子串,它从位置0,1和2开始

...

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

for循环中计数的起始位置(z = 0; z <= gi; z ++),其中函数getSubstring接收子字符串。 然后使用字符串str2的子字符串运行标准函数strstr

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

PS用C写

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

  • 构建两个字符串的通用后缀数组或后缀树。 可以证明LCS是后缀数组中具有不同颜色(属于不同字符串)的两个相邻后缀的前缀。 曾写过一篇回答 ,描述了一个简单的O(n log n)后缀数组构造算法
  • 构建一个字符串的后缀自动机,并将另一个字符串输入其中。 在每个点上检查你在自动机中的“深度”并报告所有深度的最大值。 您可以在我的GitHub中找到C ++实现

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM