KMP(字符串匹配)算法
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
//模式数组
arrNext : array of Integer;
//主串数组
Schars : array of AnsiChar;
//字串数组
Dchars : array of AnsiChar; //获取模式数组
procedure GetNext;
//查找匹配
function KPM(sPos:Integer):integer;
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm} { TForm1 } procedure TForm1.GetNext;
var
len,m,n:Integer;
begin
m := ;
n := -;
len := Length(Dchars);
SetLength(arrNext,len);
arrNext[] := -;
while (m+)<= len do
begin
if (n = -) or (Dchars[m] = Dchars[n]) then
begin
Inc(m);
Inc(n);
if (Dchars[m] <> Dchars[n]) then
arrNext[m] := n
else
arrNext[m] := arrNext[n];
end
else
begin
n := arrNext[n];
end;
end;
end; function TForm1.KPM(sPos:Integer): integer;
var
i,j:Integer;
begin
Result := ;
i := sPos;
j := ;
while (i < Length(Schars)) and (j < Length(Dchars)) do
begin
if (Schars[i] = Dchars[j]) then
begin
Inc(i);
Inc(j);
end
else
begin
Result := Result + j - arrNext[j];
if arrNext[j] <> - then
begin
j := arrNext[j];
end
else
begin
j := ;
Inc(i);
end;
end;
end;
if j <> Length(Dchars) then
Result := -;
end; procedure TForm1.Button1Click(Sender: TObject);
var
s,d:string;
index : Integer;
begin
s := '中华人民共和国';
d := '人民';
index := -;
SetLength(Schars,Length(s));
SetLength(Dchars,Length(d));
Move(s[],Schars[],Length(s));
Move(d[],Dchars[],Length(d));
GetNext;
index := KPM();
if index = - then
ShowMessage('没有找到匹配!')
else
ShowMessage('从第'+IntToStr(index+)+'个字符开始匹配');
end; end.
KMP(字符串匹配)算法的更多相关文章
- Luogu 3375 【模板】KMP字符串匹配(KMP算法)
Luogu 3375 [模板]KMP字符串匹配(KMP算法) Description 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来 ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
- P3375 【模板】KMP字符串匹配
P3375 [模板]KMP字符串匹配 https://www.luogu.org/problemnew/show/P3375 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在 ...
- 洛谷—— P3375 【模板】KMP字符串匹配
P3375 [模板]KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next. (如 ...
- KMP字符串匹配 模板 洛谷 P3375
KMP字符串匹配 模板 洛谷 P3375 题意 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.(如果 ...
- {Reship}{KMP字符串匹配}
关于KMP字符串匹配的介绍和归纳,作者的思路非常清晰,推荐看一下 http://blog.csdn.net/v_july_v/article/details/7041827
- 洛谷P3375 - 【模板】KMP字符串匹配
原题链接 Description 模板题啦~ Code //[模板]KMP字符串匹配 #include <cstdio> #include <cstring> int cons ...
- P3375 模板 KMP字符串匹配
P3375 [模板]KMP字符串匹配 来一道模板题,直接上代码. #include <bits/stdc++.h> using namespace std; typedef long lo ...
- KMP字符串匹配学习
KMP字符串匹配学习 牛逼啊 SYC大佬的博客
随机推荐
- Java 容器的使用及数组、List、Set 的相互转换
0. Utils 字符串数组的排序: Set<String> set = new TreeSet<String>(); Collections.addAll(set, args ...
- Angular 插值字符串
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 装机人员工具 - imsoft.cnblogs
链接:http://pan.baidu.com/s/1i3kgpAP 密码:4uzr
- sscanf 与 ssprintf 用法 (转载--https://www.cnblogs.com/Anker/p/3351168.html)
sprintf函数 sprintf函数原型为 int sprintf(char *str, const char *format, ...).作用是格式化字符串,具体功能如下所示: (1)将数字变量转 ...
- ZOJ 1002:Fire Net(DFS+回溯)
Fire Net Time Limit: 2 Seconds Memory Limit: 65536 KB Suppose that we have a square city with s ...
- ES最佳实践之分片使用优化
Elasticsearch最佳实践之分片使用优化 作者:老生姜 一.遇到的问题 与大多数分布式系统一样,Elasticsearch按照一定的Hash规则把用户数据切分成多个分片,然后打散到不同机器进行 ...
- SQL-数据库操作-002
数据库的创建:create database data_name on primary ( name=data_1, filename='D\Data\data_name.mdf', size=50m ...
- PHP黑魔法(该篇文章转自:http://www.91ri.org/12634.html 目的是作为自己的笔记方便查找)
那些年我们学过的PHP黑魔法 作者:Matrix_ling 序 这里必须得说一下==和===这俩货的重要性.==是比较运算,它不会去检查条件式的表达式的类型===是恒等,它会检查查表达式的值与类型是否 ...
- 【Wannafly挑战赛22A计数器】【裴蜀定理】
https://www.nowcoder.com/acm/contest/160/A 题目描述 有一个计数器,计数器的初始值为0,每次操作你可以把计数器的值加上a1,a2,...,an中的任意一个整数 ...
- 从简单的mongodb example 的观察
https://github.com/no7dw/mongodb-example 这是最基础的连接查询.(branch master) var MongoClient = require('mongo ...