如何使用字符串s的后缀树进行下一个操作,其顶点数由O(| s |)限定:
Is-k-Sub-string(r) - 检查字符串r是否是s的k子字符串,其中k-sub-string定义如下:
如果存在s对子字符串的分区,则s的子字符串r定义为k-sub-string:
R = X1X2 ...... XK; xi = s的子串。
示例:s = whitething,r = within,r是s的3个子串。
我需要在O(| r |)的复杂性中运行该操作。
我不明白如何在O(| r |)上执行此操作,因为r中的每个字符都可以是当前分隔符,例如使用2-Sub-string,所以为此我必须尝试所有可能的字符作为x1和x2之间的分隔符(对于分区r = x1x2)。
有什么想法吗?
答案 0 :(得分:0)
引理:如果A
是B
的后缀而B
可以分为k
的最多S
个子串,那么{{1} }}
证明:让A
。让我们扔掉分区的第一个B = x[1] x[2] x[3] ... x[k]
字符。我们将获得一个不超过|B| - |A|
部分的分区。
推论:如果我们有一个前缀为k
的固定分区,那么就有一个最佳分区,其中下一个子串是我们可以采用的最长子串。
解决方案紧接着上面证实的陈述。我们可以尽可能地制作每个部分:
R
这个解决方案可以在线性时间内实现:我们可以从树的根开始,并继续进行pos = 0
while pos < R.length:
take the longest prefix of R[pos:] that is a substring of R
move pos after the end of this substring
当前字符的转换。如果没有,我们将当前部分添加到答案中并从根目录重新启动。