字符串匹配的KMP算法
- - 博客园_知识库 字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD". 许多算法可以完成这个任务, Knuth-Morris-Pratt算法(简称KMP)是最常用的之一. 它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth.
public class KMP
{
public KMP()
{
}
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
String text = "ab abcb ababcb abab cb ababcb ababc ";
String pattern ="ababcb";
showList(getNext(pattern));
kmpScan(text, getNext(pattern), pattern);
}
public static void kmpScan(String str, int[] next,String pattern)
{
int k =0;
int j =0;
int count =0;
int index =0;
//int[] index = new int[count];
while(k<str.length())
{
if(j==-1&&k<str.length())
{
k++;
j=0;
}
else if(str.charAt(k)==pattern.charAt(j))
{
j++;
k++;
}
else{
j=next[j];
}
if(j==pattern.length())
{
index = k-j;
j=0;
k++;
count++;
System.out.println(index);//记录了字符出现的位置
}
}
System.out.println(count);
}
public static int[] getNext(String pattern)
{
char[] pat = pattern.toCharArray();
int[] next = new int[pattern.length()];
next[0]=-1;
next[1]=0;
for (int i = 2; i < next.length; i++)
{
int k=next[i-1];
while(k>=0)
{
if(pat[k]==pat[i-1])
break;
k=next[k];
}
next[i]=k+1;
}
return next;
}
public static void showList(int next[])
{
for (int i = 0; i < next.length; i++)
{
System.out.printf("%d ",next[i]);
}
System.out.println();
}
}