【发布时间】:2015-02-02 02:11:02
【问题描述】:
我正在尝试使用 CLRS 实现 KMP 字符串匹配算法,但是由于文本输入为“bbaa”,模式输入为“aab”,它在while 循环中陷入了无限循环 @987654322 @ 功能。我的代码如下:
private int[] getKMPPrefix(char[] p, int m) {
int[] prefix = new int[m];
prefix[0] = 0;
int k = 0;
for(int q = 1; q < m; q++) {
while(k > 0 && p[k] != p[q] ) { //Stuck here
k = prefix[k];
}
if(p[k] == p[q]) {
k++;
}
prefix[q] = k;
}
return prefix;
}
public void kmp(String text, String pattern) {
char[] t = text.toCharArray();
char[] p = pattern.toCharArray();
int n = text.length();
int m = pattern.length();
int[] prefix = getKMPPrefix(p, m);
int q = 0;
for(int i = 1; i < n; i++) {
while(q > 0 && p[q] != t[i]) {
q = prefix[q];
}
if(p[q] == t[i]) {
q++;
}
if(q == m) {
System.out.println("Pattern occurs with shift " + (i-m+1));
q = prefix[m-1];
}
}
}
知道为什么会这样吗?
【问题讨论】: