字符串匹配的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(); } }