所以对于下面的子字符串
1 2 3 4 5 6 7 8 9 10 11
a b c d a b c d a b x哪个是前缀函数?我和我的一个朋友计算了它,我们得到了不同的结果,我的是:
a b c d a b c d a b x
0 0 0 0 1 2 3 4 5 6 2他的:
a b c d a b c d a b x
0 0 0 0 1 2 3 4 1 2 0如果我错了,为什么?
发布于 2015-05-23 09:18:11
前缀表应该是:
a b c d a b c d a b x
0 0 0 0 1 2 3 4 5 6 0所以给出的两个版本都不正确。
您的表的最后一项
a b c d a b c d a b x
0 0 0 0 1 2 3 4 5 6 2
^
|
this one要正确,a b c d a b c d a b x的长度2(即b x )的后缀也必须是它的长度2前缀,即a b。
如果前缀表中的条目与零不同,则在下表中标记了相应的前缀和后缀:
a 0
a b 0
a b c 0
a b c d 0
a b c d a 1
-
=
a b c d a b 2
---
===
a b c d a b c 3
-----
=====
a b c d a b c d 4
-------
=======
a b c d a b c d a 5
---------
=========
a b c d a b c d a b 6
-----------
===========
a b c d a b c d a b x 0发布于 2015-05-23 09:02:58
我在java中的KMP函数:
public int[] KMP(String val) {
int i = 0;
int j = -1;
int[] result = new int[val.length() + 1];
result[0] = -1;
while (i < val.length()) {
while (j >= 0 && val.charAt(j) != val.charAt(i)) {
j = result[j];
}
j++;
i++;
result[i] = j;
}
return result;
}前缀数组的结果:
[-1, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 0]发布于 2015-05-23 09:16:20
你们的回答都不正确。前缀函数或部分匹配表如下:
a b c d a b c d a b x
0 0 0 0 1 2 3 4 5 6 0你的答案是正确的,直到指数10。但在上一个指数中,你做错了什么。部分匹配表的索引11的值将为0的原因是没有合适的前缀来匹配字符串的任何适当后缀,直到索引11。因为这个位置的所有适当后缀都将以x结尾,而在这个位置没有合适的前缀将以x结尾。
如果您有问题,理解什么实际上是前缀函数或部分索引表意味着您可以查看这个文档。有一个很好的解释。希望能帮上忙。
https://stackoverflow.com/questions/30410009
复制相似问题