博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[KMP]字符串匹配算法
阅读量:7066 次
发布时间:2019-06-28

本文共 991 字,大约阅读时间需要 3 分钟。

算法介绍:

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.

 

转载于:https://www.cnblogs.com/WR-Eternity/p/9743211.html

你可能感兴趣的文章
UITableView分页
查看>>
跟我一起数据挖掘(13)——矩阵分解
查看>>
CAShapeLayer(持续更新)
查看>>
JAVA UUID 生成唯一标识
查看>>
spring学习笔记(4)依赖注入详解
查看>>
菜鸟学自动化测试(五)-----selenium命令之定位页面元素
查看>>
【SICP练习】64 练习2.35
查看>>
PSK星座对象(constellation.cc)
查看>>
Linux链接脚本学习--lds
查看>>
Android将list数据通过LitePal保存到本地(集合保存到本地)
查看>>
hdu 1285 确定比赛名次
查看>>
Eureka微服务实战-服务提供者
查看>>
简单的原生ajax
查看>>
h5开发坑点小总结
查看>>
几分钟内提升技能的8个 JavaScript 方法!
查看>>
mac显示隐藏文件
查看>>
Android 插件化原理-好文收集(陆续中。。。)
查看>>
双亲委派模型与Tomcat类加载架构
查看>>
Highcharts tooltip显示数量和百分比
查看>>
小程序兼容iphoneX(齐刘海)代码,mpvue的写法
查看>>