Java 克努特–;莫里斯&x2013;普拉特算法
解决方案是:草堆:aaaaaaaa,针:AAA,哪个是:3,对吗 因为,草堆中有8个AAA实例,但据我所知,knuth-morris-pratt算法只能找到3个。我这样想是不是错了 这个问题可以通过找出字符串中每个后缀的边界来解决吗 以下是我对KMP算法的实现:Java 克努特–;莫里斯&x2013;普拉特算法,java,string,Java,String,解决方案是:草堆:aaaaaaaa,针:AAA,哪个是:3,对吗 因为,草堆中有8个AAA实例,但据我所知,knuth-morris-pratt算法只能找到3个。我这样想是不是错了 这个问题可以通过找出字符串中每个后缀的边界来解决吗 以下是我对KMP算法的实现: public static int occurrenceOfSubstring(char[] target, char[] pattern) { int[] overlay = new int[pattern.lengt
public static int occurrenceOfSubstring(char[] target, char[] pattern) {
int[] overlay = new int[pattern.length];
overlay[0] = -1;
overlay[1] = 0;
int i = 0, j = 1;
while (j + 1 < pattern.length) {
if (pattern[i] == pattern[j]) {
if (i == 0) {
overlay[j + 1] = 1;
} else {
overlay[j + 1] = overlay[j] + 1;
}
i++;
j++;
} else if (pattern[j] == pattern[0]) {
i = 0;
} else {
j++;
}
}
int l = 0,count=0;
for (int k = 0; k < target.length; k++) {
if (target[k] == pattern[l]) {
if (l == pattern.length - 1) {
l = 0;
count++;
} else {
l++;
}
} else {
l = overlay[l] == -1 ? 0 : overlay[l];
}
}
return count;
}
子字符串的公共静态int发生率(char[]目标,char[]模式){
int[]覆盖=新的int[pattern.length];
叠加[0]=-1;
叠加[1]=0;
int i=0,j=1;
而(j+1<模式长度){
if(模式[i]==模式[j]){
如果(i==0){
叠加[j+1]=1;
}否则{
叠加[j+1]=叠加[j]+1;
}
i++;
j++;
}else if(模式[j]==模式[0]){
i=0;
}否则{
j++;
}
}
int l=0,count=0;
for(int k=0;k