KMP
来源:互联网 发布:国家数据恢复中心 地址 编辑:程序博客网 时间:2024/05/11 12:22
package edu.liangman.offer;/** * Created by lm on 2017/1/1. */public class KMP {public int[] getNext(String b){ int len=b.length(); int j=0; int next[]=new int[len+1];//next表示长度为i的字符串前缀和后缀的最长公共部分,从1开始 next[0]=next[1]=0; for(int i=1;i<len;i++)//i表示字符串的下标,从0开始 {//j在每次循环开始都表示next[i]的值,同时也表示需要比较的下一个位置 while(j>0&&b.charAt(i)!=b.charAt(j))j=next[j]; if(b.charAt(i)==b.charAt(j))j++; next[i+1]=j; } return next;} public void search(String original, String find, int next[]) { int j = 0; for (int i = 0; i < original.length(); i++) { while (j > 0 && original.charAt(i) != find.charAt(j)) j = next[j]; if (original.charAt(i) == find.charAt(j)) j++; if (j == find.length()) { System.out.println("位置在" + (i - j+1)); System.out.println(original.subSequence(i - j+1 , i + 1)); break; //如果想全部查到,调用下面的 //j = next[j]; } } } public static void main(String[] args){ KMP kmp = new KMP(); int[] a = kmp.getNext("abcab"); kmp.search("abcabbabcab","abcab",a); for(int i=0;i<a.length;i++){ System.out.println(a[i]); } }}
前些日子看了下这个算法,没怎么看懂,今天又重新看了下,看了好几个博客,也看了下严老师的讲解,应该算是把它收了。
0 0