KMP算法实现

package jxau.blueDot.lyx;

/**
 *@liyixiang
 *@2014-8-17
 *@TODO:
 *		快速匹配算法——KMP
 */
public class KnuthMorrisPratt {
	
	//KMP中的核心算法,获得记录跳转状态的next数组
	/**
	 * 
	 * @param sub: 子串
	 * @return 返回next数组 用于进行下一次匹配,保存的是匹配值
	 */
	public static int[] next(String sub) {
		
	         int[] a = new int[sub.length()];
	         char[] c = sub.toCharArray();   //获取字符数组
	         int length=sub.length();           //字符数组长度
	         
	         int i,j;
	         a[0] = -1;
	         i = 0;
	         
	         //i为匹配值
             for(j=1;j<length;j++) {
                 i = a[j - 1];
                 
                 //i>=0说明正在进行匹配
                 while(i>=0&&c[j]!=c[i+1]) {
                     i = a[i];    
                 }
                 //依次匹配顺序 例如:0 0 0 1 2 3
                 if(c[j]==c[i+1]) {
                    a[j] = i+1;
                 }
                 else {
                    a[j] = -1;
                 }
             }
             
	         return a;
	}
	
	
	public static void pattern(String str,String sub,int[] next) {
		
		//转换为字符数组,方便匹配
        char[] ch1 = str.toCharArray();
        char[] ch2 = sub.toCharArray();
        
        int i = 0,j = 0;  //i控制ch1,j控制ch2;
        
        for(;i<ch1.length; ) {
            if(ch1[i]==ch2[j]) {//匹配就自动递增,往后匹配。
                if(j==ch2.length-1) {
                    System.out.println(i-ch2.length+1);//打印出偏移位置
                    break;
                }
                //同时控制i与j
                j++;
                i++;
            }
            
            else if(j==0) {
                 i++;
            }
            
            else {
                j = next[j-1]+1;
            }
        }
    }
	
	public static void main(String[] args) {
		
        String sub ="aabaccfaddddaabc";
        String str = "gdsaaabaccfaddddaabccfdaddacfaddddaabcga";
        int[] next = next(sub);
        pattern(str,sub,next);
        
    }
	
}

具体原理可参考之前的原理分析。

你可能感兴趣的:(KMP算法实现)