算法模板——KMP字符串匹配
时间:2022-05-07
本文章向大家介绍算法模板——KMP字符串匹配,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
功能:输入一个原串,再输入N个待匹配串,在待匹配串中找出全部原串的起始位置
原理:KMP算法,其实这个东西已经包含了AC自动机的思想(fail指针/数组),只不过适用于单模板匹配,不过值得一提的是在单模板大量匹配待匹配串时,这个会有相当大的优势,AC自动机虽然好想一些,但是在这一类问题上的性价比就略低了
1 var
2 i,j,k,l,m,n:longint;
3 a:array[0..100000] of longint;
4 s1,s2:ansistring;
5 begin
6 readln(s1);
7 a[1]:=0;
8 for i:=2 to length(s1) do
9 begin
10 j:=a[i-1];
11 while (j>0) and (s1[j+1]<>s1[i]) do j:=a[j];
12 if s1[j+1]=s1[i] then a[i]:=j+1 else a[i]:=0;
13 end;
14 readln(n);
15 for l:=1 to n do
16 begin
17 readln(s2);
18 j:=0;
19 for i:=1 to length(s2) do
20 begin
21 inc(j);
22 if s1[j]=s2[i] then
23 begin
24 if j=length(s1) then
25 begin
26 write(i-length(s1)+1,' ');
27 j:=a[j];
28 end;
29 end
30 else
31 begin
32 j:=j-1;
33 while (j>0) and (s1[j+1]<>s2[i]) do j:=a[j];
34 if s1[j+1]=s2[i] then inc(j) else j:=0;
35 end;
36 end;
37 writeln;
38 end;
39 readln;
40 end.
41
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 最难链表题——LeetCode题目25:K 个一组翻转链表
- LeetCode题目26:删除排序数组中的重复项
- PCA算法原理及实现
- LeetCode题目27:移出元素
- LeetCode题目28:实现strStr()
- LeetCode题目29:两数相除
- LeetCode题目30:串联所有单词的子串
- LeetCode题目31:下一个排列
- LeetCode题目33:搜索旋转排序数组
- LeetCode题目34:在排序数组中查找元素的第一个和最后一个位置
- LeetCode题目35:搜索插入位置
- LeetCode题目36:有效的数独
- 你必须掌握动态规划——LeetCode题目5:最长回文子串
- 有意思的难题——LeetCode题目37:解数独
- 源码分析-分布式链路追踪:Skywalking存储插件能力-elasticsearch