这是JAVA的实现方法,你看一下:public class KMP
{
public static int[] preProcess(char[] B)
{
int size = B.length;
int[] P = new int[size]; //给模式匹配串添加一个P数组
P[0] = 0; //也将就是KMP算法中非著名的next数组
int j = 0; //它指导者模式匹配串下一步改用第几号元素去进行匹配
for (int i=1; i < size; i++ ) //j为前缀标号 i为后缀标号
{
while (j>0 && B[j] != B[i] )
{
j = P[j];
}
if (B[j] == B[i])
{
j++;
}
P[i] = j;
}
return P;
}
public static void kmp(String parStr, String subStr ) //kmp算法的实现
{
int subSize = subStr.length(); //子串
int parSize = parStr.length(); //主串
char[] B = subStr.toCharArray();
char[] A = parStr.toCharArray();
int[] P = preProcess(B);
int j = 0;
int k = 0;
for (int i=0; i < parSize; i++ )
{
while (j > 0 && B[j] != A[i] )
{
j = P[j-1];
}
if (B[j] == A[i])
{
j++;
}
if (j == subSize)
{
j = P[j-1];
k++;
System.out.printf("Find subString '%s' at %d\n", subStr, i-subSize+1);
}
}
System.out.printf("Totally found %d times for '%s'.\n\n", k, subStr);
}
public static void main(String args[])
{
kmp("abcdeg, abcdeh, abcdef!", "abcdef");
kmp("测试汉字的匹配,小白马","小白马");
}
}
|