2个字符串实现的最长公共子串

时间:2013-07-05 22:15:25

标签: c algorithm pattern-matching longest-substring

我正在尝试在C中实现最长公共子串算法,在阅读下面的帖子之后,我对以下部分感到困惑:

现在,最大值是LCP [2] = 3,但它适用于SA [1]和SA [2],两者都以字符串A开头。所以,我们忽略它。另一方面,LCP [4] = 2用于 SA [3](对应于B的后缀bc)和SA [4](对应于A的后缀bcabc#bc)。所以,这是最常见的子串。

我的LCP结果也与帖子示例不同。

https://cs.stackexchange.com/questions/9555/computing-the-longest-common-substring-of-two-strings-using-suffix-arrays

字符串A = abcabc

字符串B = bc

字符串分隔符:'#'

后缀数组

[#bc,abc#bc,abcabc#bc,bc,bc#bc,bcabc#bc,c,c#bc,cabc #bc]

LCP

[ - 1,0,3,0,2,2,0,1,1]

删除第一个元素

后缀数组

[abc#bc,abcabc#bc,bc,bc#bc,bcabc#bc,c,c#bc,cabc #bc]

LCP

[0,3,0,2,2,0,1,1]

我看到SA [3]对应 bc ,但SA [4]对应于(我猜) #bcbc 。所以,这让我感到困惑。

任何人都可以澄清一下吗?谢谢!

1 个答案:

答案 0 :(得分:1)

  

我看到SA [3]对应bc,但SA [4]对应(我猜)#bcbc。

上面的任何地方都找不到#bcbc。引用说" SA [4](对应于A的后缀bcabc#bc)"这当然是对的:

 0       1          2   3      4         5  6     7        index
[abc#bc, abcabc#bc, bc, bc#bc, bcabc#bc, c, c#bc, cabc#bc] Suffix Array
[0,      3,         0,  2,     2,        0, 1,    1]       LCP

SA [2]是B的后缀,SA [3]是A(#B)的后缀,因此最长的公共子串是bc,长度为2.