算法介绍:

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.

最新文章

  1. java调用mysql服务做备份与恢复
  2. P6 EPPM 16 R1 文档和帮助系统
  3. Android 中的openurl
  4. Matlab实现抽样定理
  5. SharePoint 2010 获取列表全部定义方法
  6. eclipse @ 注释为何一写就报错
  7. poj:4091:The Closest M Points
  8. JavaSE基础问答
  9. nuxt
  10. C++中模板的使用
  11. POJ 1251 + HDU 1301 Jungle Roads 【最小生成树】
  12. selectTree &amp; bug
  13. Yes,I know the way to learn Ens !
  14. Elasticsearch-搜索推荐
  15. 详解tomcat连接数和线程数
  16. QEMU漏洞挖掘
  17. CentOS–root密码忘记的解决办法
  18. MoQ(基于.net3.5,c#3.0的mock框架)简单介绍(转)
  19. js获取浏览器宽高、网页宽高、屏幕宽高、鼠标位置等(带图片说明)
  20. isMemberOf与isKindOf的区别

热门文章

  1. Easy Problem(等差数列求和导公式)
  2. akka-streams - 从应用角度学习:basic stream parts
  3. luogu P3796 【模板】AC自动机(加强版)
  4. whlie do-whlie
  5. VUE常用问题hack修改
  6. @RequestBody使用说明
  7. 《Java从入门到失业》第四章:类和对象(4.1):初识类和对象
  8. Css3新增的特性(1)
  9. 一、loadrunner脚本录制及回放
  10. PHP之道(PHP The Right Way)