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
原创粉丝点击