算法介绍:

KMP是一种用来处理字符串匹配问题的算法,给你两个字符串A、B,让你回答B是否为A的子串,或者A中有多少子串等于B。

这题最暴力的做法是:枚举A中与B相等的子串的左端点,再判断是否与B相等,时间复杂度是O(nm)的,很慢。而我们要介绍的KMP算法的时间复杂度是理论上O(n+m)的,比他要快得多。

算法核心思路分析:

KMP算法其实是这么做的:两个指针,i,j,表示A中从i-j+1到i的这段子串与B的1到j完全相等。当A[i+1]=B[j+1]时显然两个指针都自增1即可。那么当A[i+1]<>B[j+1]时呢?我们就需要重新匹配j指针,找到能够与指针i+1相匹配的新也要是最大的的指针j,使得以上关系仍然成立(注意是重新匹配指针j,而i始终按照自己的进程不断地+1)。而我们应该如何重新匹配指针j呢?注意到字符串B中,会有子串1-x,为1-j的子串,而如果有A[i+1]<>B[j+1]但是A[i+1]=B[x+1]的话,我们便不用直接将指针j清零,只需要把j赋为x即可。

代码:

var
p:array[0..1000]of longint;
a,b:string;
i,j,lena,lenb,ans:longint;
begin
readln(a);
readln(b);
lena:=length(a); lenb:=length(b);
p[1]:=0; j:=0;
for i:=1 to lenb-1 do
begin
while (j>0)and(b[j+1]<>b[i+1]) do j:=p[j];
if b[j+1]=b[i+1] then inc(j);
p[i+1]:=j;
end;
j:=0;
for i:=0 to lena-1 do
begin
while (j>0)and(a[i+1]<>b[j+1]) do j:=p[j];
if b[j+1]=a[i+1] then inc(j);
if j=lenb then
begin
inc(ans);
j:=p[j];
end;
end;
writeln(ans);
end.

[KMP]字符串匹配算法的更多相关文章

  1. BM和KMP字符串匹配算法学习

    BM和KMP字符串匹配算法学习 分类: 研究与学习 字符串匹配BM(Boyer-Moore)算法学习心得 http://www.cnblogs.com/a180285/archive/2011/12/ ...

  2. KMP字符串匹配算法理解(转)

    一.引言 主串(被扫描的串):S='s0s1...sn-1',i 为主串下标指针,指示每回合匹配过程中主串的当前被比较字符: 模式串(需要在主串中寻找的串):P='p0p1...pm-1',j 为模式 ...

  3. 【KMP】【字符串】KMP字符串匹配算法 学习笔记

    一.简介     KMP是由Knuth.Morris和Prat发明的字符串匹配算法,它的时间复杂度是均摊\(O(n+m)\).其实用Hash也可以做到线性,只不过Hash存在极其微小的难以避免的冲突. ...

  4. KMP字符串匹配算法翔解❤

    看了Angel_Kitty学姐的博客,我豁然开朗,写下此文: 那么首先我们知道,kmp算法是一种字符串匹配算法,那么我们来看一个例子. 比方说,现在我有两段像这样子的字符串: 分别是T和P,很明显,P ...

  5. 每周一算法之六——KMP字符串匹配算法

    KMP是一种著名的字符串模式匹配算法,它的名称来自三个发明人的名字.这个算法的一个特点就是,在匹配时,主串的指针不用回溯,整个匹配过程中,只需要对主串扫描一遍就可以了.因此适合对大字符串进行匹配. 搜 ...

  6. 保证你能看懂的KMP字符串匹配算法

    文章转载自一位大牛: 阮一峰原网址http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm ...

  7. 子字符串substring 问题 - KMP 字符串匹配算法备忘录

    本文为自己对KMP的理解. 对KMP很好的介绍可以参考 http://www.cnblogs.com/yjiyjige/p/3263858.html 本文为对这篇文章的提炼和补充. KMP算法基本思想 ...

  8. KMP字符串匹配算法详解

    KMP算法利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息.时间复杂度O(m+n). Next()函数 ...

  9. KMP字符串匹配算法

    static void Main(string[] args) { var d = KMP("abcabcadabc55abcabcadabc55", "abcabcad ...

随机推荐

  1. Vue中父组件使用子组件的emit事件,获取emit事件传出的值并添加父组件额外的参数进行操作

    需求是这样的,需要输入这样一个列表的数据,可以手动添加行,每一行中客户编号跟客户姓名是自动关联的,就是说选取了客户姓名之后,客户编号是自动填充的,客户姓名是一个独立的组件,每一个下拉项都是一个大的对象 ...

  2. SpringBoot整合Quartz及log4j实例

    SpringBoot整合Quartz及log4j实例 因为之前项目中经常会做一些定时Job的东西,所以在此记录一下,目前项目中已经使用elastic-job,这个能相对比Quartz更加简单方便一些, ...

  3. Q200510-02: 重复的DNA序列 程序解法

    问题:  重复的DNA序列 所有 DNA 都由一系列缩写为 A,C,G 和 T 的核苷酸组成,例如:“ACGAATTCCG”.在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助. 编 ...

  4. Java得到指定日期的时间

    //得到指定日期(几天前/几天后)整数往后推,负数往前移动private Date getAppointDay(int num) throws ParseException { DateFormat ...

  5. nginx安装第三方模块echo

    要使用第三方模块ngx_echo的功能,请重新配置添加到nginx插件中 ##下载第三方模块 wget https://github.com/openresty/echo-nginx-module/a ...

  6. Windows7上开启ftp服务器功能

    开启ftp服务功能   1 进入“控制面板”->“程序”->"打开或关闭Windows功能",找到“Internet信息服务”选项 2 将“Internet信息服务”选 ...

  7. Java高并发系列——检视阅读

    Java高并发系列--检视阅读 参考 java高并发系列 liaoxuefeng Java教程 CompletableFuture AQS原理没讲,需要找资料补充. JUC中常见的集合原来没讲,比如C ...

  8. jzoj 3567. 【GDKOI2014】石油储备计划

    Problem Description Input Output 对于每组数据,输出一个整数,表示达到"平衡"状态所需的最小代价. Data Constraint 对于20%的数据 ...

  9. 如何使用dockerfile将jar包生成镜像

    1.编写dockersfile FROM java:8 ADD SPRINGCLOUD.jar app.jar RUN bash -c ‘touch /app.jar’ ENTRYPOINT [&qu ...

  10. Centos7,PHP7安装swoole

    Swoole详细介绍及如何使用,这里暂时不做说明,可以参考一下文档:https://wiki.swoole.com/ 源码编译安装 下载地址如下: https://github.com/swoole/ ...