我们需要找到两个字符串之间最短的非公共子串,即如果我们有两个字符串
a
和b
,那么我们需要找到a
的最短子串长度,该子串不是b
的子串。
如何使用后缀数组解决这个问题?
要求解的复杂度不超过n*log(n)。
a
和b
,那么我们需要找到a
的最短子串长度,该子串不是b
的子串。
如何使用后缀数组解决这个问题?
要求解的复杂度不超过n*log(n)。
可以使用广义后缀树以 O(N) 的时间解决这个问题。
在 O(N) 的时间内构建广义后缀树后,需要执行广度优先搜索并找到第一个不属于两个字符串的节点。从根到该节点的路径给出了最短的非公共子串。
同样地,可以使用两个输入字符串的广义后缀数组在 O(N) 的时间内完成相同的操作。
构造广义后缀数组和 LCP 数组(或稍后从后缀数组构造 LCP 数组)。将单个零元素添加为 LCP 数组的前缀;再添加另一个零元素作为后缀。以这种方式找到一对最小的 LCP 条目,使得只有一个字符串的后缀由这些条目分隔。这意味着您需要线性扫描 LCP 数组,提取两个最小值,但每次看到不同字符串的后缀或者看到属于两个字符串的后缀时都必须将两个最小值重置为无穷大。这些对中最佳对中较大的元素(具有对中较大元素的最小值)给出了最短的非公共子串的长度。这起作用是因为这对最小值限定了不属于相应后缀树中两个字符串的第一个节点(最靠近根的节点)所有后代。