int kmp(char * t,int lenT,char * pat,int lenPat){
int posP=,posT=;
int[] f=partialMatch(pat,lenPat)//获取pat字符串的部分匹配数组
while(posP<lenPat && posT<lenT){
if(pat[posP]==t[posT]){
posT++;
posP++;
}
else if(posP==) posT++;//第一就不匹配,目标字符串向后移动
else posP=f[posP-]+;//前面都匹配,则将搜索字符串,直接移动到未比较过的位置
}
if(posP<lenPat)return -;//如果posP没有遍历完搜索字符串,则说明没有找到
else return posT-lenPat; //找到了,则返回在目标字符串中的起始位置
} /*递推方法:
f[j]=k,str[0:k-1]== str[j-k:j-1],这是从str[0:j-1]中找到其前缀子串集合和其后缀子串集合的交集中的最大子串。 假设 f[j]=k,即str[0:k-1]==str[j-k:j-1]
如果 str[k]== str[j] => str[0:k]==str[j-k:j] => f[j]=k+1
如果 str[k]!=str[j] =>
如果找到最大整数 h,满足str[0:h-1]==str[k-h:k-1],即f[k]=h,也就是说str[0:k-1]中存在一个最大子串str[0:h-1],
然后判断str[h+1]与str[j]是否相等,如果不等,再从str[0:h-1]子串中去找到最大子串,然后再去判断
如果找不到 最大子串, 则f[j+1]=-1 */
int[] partialMatch(char * s,int len){
int[] f=new int[len];
f[]=-;//递推种子
for(int j=;j<len-;j++){
int k=f[j];
while(k>= && *(s+j+)!=*(s+k+))
k=f[k]; //判断是否有子串符合 *(s+j)==*(s+k+1),如果不等,从子串中继续找最大子串。
if(*(s+j+)==*(s+k+))
f[j+]=k+;
else
f[k]=-;
}
}

一直都没看懂,直到看了这篇文章:http://kb.cnblogs.com/page/176818/

学习KMP算法的更多相关文章

  1. 学习KMP算法的一点小心得

    KMP算法应用于 在一篇有n个字母的文档中 查找某个想要查找的长度为m的单词:暴力枚举:从文档的前m个字母和单词对比,然后是第2到m+1个,然后是第3到m+2个:这样算法复杂度最坏就达到了O(m*n) ...

  2. 学习 KMP 算法

    KMP 算法是用来处理字符串匹配问题的.也就是给你两个字符串,你需要回答:B 串是否是 A 串的子串(或 B 串在 A 串中出现的位置).比如,字符串 A = “ i am student ”, 字符 ...

  3. 【2018.07.27】(字符串/找相同)学习KMP算法小记

    虽然说原理很好理解,但是代码理解了花费我一个下午的时间,脑阔痛 该注释的地方都标记了,希望以后看到这些代码我还能好好理解吧 学习的链接地址:https://www.cnblogs.com/teble/ ...

  4. KMP算法(研究总结,字符串)

    KMP算法(研究总结,字符串) 前段时间学习KMP算法,感觉有些复杂,不过好歹是弄懂啦,简单地记录一下,方便以后自己回忆. 引入 首先我们来看一个例子,现在有两个字符串A和B,问你在A中是否有B,有几 ...

  5. KMP算法具体解释

    这几天学习kmp算法,解决字符串的匹配问题.開始的时候都是用到BF算法,(BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配 ...

  6. 运用kmp算法解决的一些问题的简单题解

    学习kmp算法我最后是看的数据结构书上的一本教材学会的..我认为kmp相对于普通的BF算法就是避免了非常多不必要的匹配.而kmp算法的精髓自然就在于next数组的运用...而next数组简而言之就是存 ...

  7. LA 3026 && POJ 1961 Period (KMP算法)

    题意:给定一个长度为n字符串s,求它每个前缀的最短循环节.也就是对于每个i(2<=i<=n),求一个最大整数k>1(如果存在),使得s的前i个字符组成的前缀是某个字符串重复得k次得到 ...

  8. KMP算法,查询匹配串的个数

    想不到时隔两年回来重新学习KMP算法还是那么难,不过理解了大概,把例程贴上来,如果是求数量只需要加个count变量记录即可. #include"stdio.h" #include& ...

  9. KMP算法的一个简单实现

    今天学习KMP算法,参考网上内容,实现算法,摘录网页内容并记录自己的实现如下: 原文出处: http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93M ...

随机推荐

  1. Android开发-API指南-<action>

    <action> 英文原文:http://developer.android.com/guide/topics/manifest/action-element.html 采集(更新)日期: ...

  2. apache中若干模块的安装

    第一次手动安装apache,由于在./configure -prefix=/usr/local/apache2 -enable-module=so这样配置,导致后来不得不手动安装一些模块,遇到了一些坑 ...

  3. def

    a = 97,A = 65,z = 122,Z = 90 小写字母比大写字母整形数值高,upper->lower相差32 把小写字母转化成大写字母,将小写字母 - 32 1. typedef 数 ...

  4. win7系统服务print spooler 无法启动解决方法(开启及关闭方法)

    以下是小编从新浪博客一个大雕博客中找到的“print spooler 无法启动”解决方法,请您仔细参考. 在下的系统是Windows7正式版,因为经常要制作PDF文件,所以对虚拟打印机使用较多,在下的 ...

  5. 对像转成 和 byte 互转类库方法

    using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serializatio ...

  6. IE 不兼容的几个js问题及解决方法1

    IE 不兼容的几个js问题及解决方法 1 Table的问题   在动态新增tr或者td时,createElecment() 一般用appendChild();都不生效,解决办法是用新增tbody, 如 ...

  7. WeChat 6.3 wipe deleted chat messages as well as LINE 5.3 and above

    Let me show you the WeChat version first. It is 6.3. What will happen to WeChat deleted chat message ...

  8. 2016.04.09 使用Powerdesigner进行创建数据库的概念模型并转为物理模型

    2016-04-09  21:10:24     本文原创受版权保护,严禁转载. 请大家不要用于商业用途,支持正版,大家都是做软件的,知道开发一套软件实属不易啊! 今天看到了一个很有趣并且很有用的辅助 ...

  9. 信息图形(Infographic)

    信息图形(Infographic),又称为信息图,是指数据.信息或知识的可视化表现形式.信息图形主要应用于必须要有一个清楚准确的解释或表达甚为复杂且大量的信息,例如在各式各样的文件档案上.各个地图及标 ...

  10. ASP.NET MVC5 高级编程 第5章 表单和HTML辅助方法

    参考资料<ASP.NET MVC5 高级编程>第5版 第5章 表单和HTML辅助方法 5.1 表单的使用 5.1.1 action 和 method 特性 默认情况下,表单发送的是 HTT ...