KMP算法最大的优点之处:在匹配失败时,主串中的指针i不需要回溯,而是在模式中找出适当的字符继续比较。下面是模式串中的失败函数
i= 0 1 2 3 4
模式 a a a a b
Next[i]= -1 0 1 2 3 // 没改进的失败函数
Nextval[j]=-1 -1 -1 -1 3 // 改进的失败函数
public class KMP
{
public static void main(String[] args)
{
// 主串
char[] aim = {'a','c','a','b','a','a','b','a','a','b','c','a','a','b','a','a','a','a'};
// 模式串(匹配串)
char[] pattern = {'a','b','a','a','b','c','a','c'};
// 调用KMP算法返回下标
int position = kmp(aim,pattern);
System.out.println(position);
}
public int kmp(char[] aim,char[] pattern)
{
int len1 = aim.length;
int len2 = pattern.length;
int[] next = new int[len2];
getNext(next,pattern);
int i=0,j=0;
while(i<len2&&j<len1)
{
if(i<0||aim[j]==pattern[i])
{
++i;
++j;
}else
i = next[i];
}
if(i==len2-1)
return j-i;
return -1;
}
public void getNext(int[] next,char[] pattern)
{
int len = pattern.length;
int i=-1,k=0;
next[0] = -1;
while(k<len-1)
{
if(i<0||pattern[i]==pattern[k])
{
++i;
++k;
if(pattern[i]==pattern[k])
next[k] = next[i];
else
next[k] = i;
}else
i = next[i];
}
}
}