zoukankan      html  css  js  c++  java
  • KMP快速模式匹配的java实现

    假期实在无聊赖啊。把这个算法实现了一下即算是打发时间也算练练手了。

    KMP算法的关键是用归纳法计算失败函数。网上很详细了。下面直接给出代码。

    /**
     * 
     * @author Vincent
     *
     */
    public class PatternMap {
    	private String pat; //模式
    	private int [] f; //模式对应的失败函数
    	private String source; //目标
    	PatternMap(String p,String s){ pat=p;source=s;f=new int[pat.length()];  }
    	int KMP_FastFind(){
    		Fail();
    		int p=0,s=0;
    		int m=pat.length(),n=source.length();
    		while(p<m&&s<n){
    			if(pat.charAt(p)==source.charAt(s)){
    				p++;s++;
    			}
    			else if(p==0)s++;
    			else
    				p=f[p-1]+1;
    		}
    		if(p<m)
    			return -1;
    		return s-m; //下标从0开始
    	}
    	void Fail(){
    		int m=pat.length();
    		f[0]=-1;
    		int i=0;
    		for(int j=1;j<m;j++){
    			i=f[j-1];
    			while( (pat.charAt(j)!=pat.charAt(i+1)) && (i>0) ){
    				i=f[i];
    			}
    			if(pat.charAt(j)==pat.charAt(i+1)){
    				f[j]=i+1;
    			}
    			else f[j]=-1;
    		}
    	}
    	public static void main(String[] args){
    		PatternMap pm=new PatternMap("vince_iamvincent","vincevince_iamvincentaaa");
    		System.out.println(pm.KMP_FastFind());
    		/*
    		 * print 失败函数
    		 */
    		int m=pm.pat.length();
    		for(int i=0;i<m;i++){
    			System.out.println(pm.f[i]);
    		}
    	}
    }
    
  • 相关阅读:
    python中元类(metaclass)的理解
    aiohttp
    async/await
    asyncio
    协程
    Bayesian Non-Exhaustive Classification A case study:online name disambiguation using temporal record streams
    技术网址
    网站
    各种网址
    OpenGL学习网址2
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3215139.html
Copyright © 2011-2022 走看看