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

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]);
}
}
}

KMP快速模式匹配的java实现的更多相关文章

  1. [刘阳Java]_避开环境配置快速的使用Java的开发工具_第5讲

    我们一般学习Java都应该遵循通过系统的命令工具来编译Java程序,然后对编译好Java程序进行运行,这个是非常好的习惯.但是随着后期学习Java技术的深入我们也得像Java的IDE工具屈服.所以,可 ...

  2. KMP字符串模式匹配详解(转)

    来自CSDN     A_B_C_ABC 网友 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算法.可以证明它的时间复杂度 ...

  3. KMP字符串模式匹配详解(zz)

    刚看到位兄弟也贴了份KMP算法说明,但本人觉得说的不是很详细,当初我在看这个算法的时候也看的头晕昏昏的,我贴的这份也是网上找的.且听详细分解: KMP字符串模式匹配详解 来自CSDN     A_B_ ...

  4. 【译】快速高效学习Java编程在线资源Top 20

    想要加强你的编程能力吗?想要提升你的 Java 编程技巧和效率吗? 不用担心.本文将会提供快速高效学习 Java 编程的 50 多个网站资源: 开始探索吧: 1.MKyong:许多开发者在这里可以找到 ...

  5. KMP字符串模式匹配详解

    KMP字符串模式匹配详解 http://www.cppblog.com/oosky/archive/2006/07/06/9486.html

  6. 【Java】15分钟快速体验阿里Java诊断工具Arthas

    [墙裂推荐]15分钟快速体验阿里Java诊断工具Arthas : https://alibaba.github.io/arthas/arthas-tutorials?language=cn&i ...

  7. 快速高效学习Java编程在线资源Top 20(转载)

    想要加强你的编程能力吗?想要提升你的 Java 编程技巧和效率吗? 不用担心.本文将会提供快速高效学习 Java 编程的 50 多个网站资源: 开始探索吧: 1.MKyong:许多开发者在这里可以找到 ...

  8. KMP算法(快速模式匹配)

    详细理解看这里:http://kb.cnblogs.com/page/176818/ 或者这里:http://blog.csdn.net/yutianzuijin/article/details/11 ...

  9. 经典KMP算法C++与Java实现代码

    前言: KMP算法是一种字符串匹配算法,由Knuth,Morris和Pratt同时发现(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.比 ...

随机推荐

  1. Container With Most Water 解答

    Question Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate ...

  2. LeeCode-Number of 1 Bits

    Write a function that takes an unsigned integer and returns the number of ’1' bits it has For exampl ...

  3. poj1833 排列

                                                                                                         ...

  4. 解决 VM虚拟机网卡无法拉起 的问题

    复制虚拟机后,第二块网卡始终无法正常运作,表现为无法自动获得dhcp地址,且重启后与第一块网卡使用同样的地址,让人苦笑不得,反复重启了很多次都是这样,后面想到ifcfg-eth1的配置文件可能写得太简 ...

  5. wxpython StatuBar 带进度条的状态栏

    # -*- coding: utf- -*- import wx class customStatusBar(wx.StatusBar): def __init__(self, parent): wx ...

  6. wpf动画概述

    http://msdn.microsoft.com/zh-cn/library/vstudio/ms752312(v=vs.100).aspx Windows Presentation Foundat ...

  7. ubuntu如何开启SSH服务

    ubuntu如何开启SSH服务 分类: Linux 运维与操作基础2013-02-24 13:33 2868人阅读 评论(0) 收藏 举报 sshd ubuntu ubuntu默认并没有安装ssh服务 ...

  8. 第二章实例:动态生成View控件例子---小球跟随手指滑动

    package mydefault.packge; import android.app.Activity; import android.content.Context; import androi ...

  9. OC——动态添加Button和监听UIAlertView按钮

    1:动态添加uibutton - (IBAction)addButton:(id)sender { CGRect frame = CGRectMake(90, 200, 200, 60); UIBut ...

  10. Octet string 解析

    百度百科的 ASN.1 http://baike.baidu.com/view/26378.htm 什么是 octet string 结构化字节 怎么解析,这里有微软的解析方法 If the byte ...