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. Python安装Selenium3

    概述 2016.10.13,Selenium3.0正式发布,官方说明如下: The major change in Selenium 3.0 is we're removing the origina ...

  2. DAY13 Matlab实现图像错切源代码

    Matlab实现图像错切源代码 %错切im=(imread('robot.jpg'));im1=rgb2gray(im);figure,imshow(im1);[row,col]=size(im1); ...

  3. Android开发-API指南-<application>

    <application> 英文原文:http://developer.android.com/guide/topics/manifest/application-element.html ...

  4. Android开发-API指南-Manifest介绍

    App Manifest 英文原文:http://developer.android.com/guide/topics/manifest/manifest-intro.html 采集(更新)日期:20 ...

  5. linux使用flock文件锁解决crontab冲突问题

    * * * * * flock -xn /dev/shm/redis.lock -c "/usr/local/bin/redis-server" 可以用flock命令,配合使用rs ...

  6. Android基础总结(12)——XML和JSON解析

    XML和JSON解析 在网络上传输数据时最常用的格式有两种:XML和JSON.本文主要就是学习如何对这两种常用的数据格式进行解析. 1.XML和JSON的定义 XML:扩展标记语言 (Extensib ...

  7. 二模08day1解题报告

    T1.高中运动会(match) N个数的最大公约数. gcd不解释. T2.智力游戏 火柴棒等式形如a+b=c,现在给出啊a,b,c求使等式成立的最小的移动次数. 火柴棒表示数字不用解释了吧,在此提醒 ...

  8. ajax 跳入error的一些原因

    先放一个标准的jquery的ajax代码: $.ajax({ type: 'POST', url: 'getSecondClassification', data: {"sort2" ...

  9. 5 Ways to Learn and Remember Absolutely Anything

    http://www.inc.com/quora/5-ways-to-learn-and-remember-absolutely-anything.html Start too early on th ...

  10. OpenJudge 2809 计算2的N次方

    1.链接地址: http://bailian.openjudge.cn/practice/2809/ 2.题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 任意给定一个正整数N(N ...