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(字符串匹配)算法的更多相关文章

  1. Luogu 3375 【模板】KMP字符串匹配(KMP算法)

    Luogu 3375 [模板]KMP字符串匹配(KMP算法) Description 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来 ...

  2. 洛谷P3375 [模板]KMP字符串匹配

    To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...

  3. P3375 【模板】KMP字符串匹配

    P3375 [模板]KMP字符串匹配 https://www.luogu.org/problemnew/show/P3375 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在 ...

  4. 洛谷—— P3375 【模板】KMP字符串匹配

    P3375 [模板]KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next. (如 ...

  5. KMP字符串匹配 模板 洛谷 P3375

    KMP字符串匹配 模板 洛谷 P3375 题意 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.(如果 ...

  6. {Reship}{KMP字符串匹配}

    关于KMP字符串匹配的介绍和归纳,作者的思路非常清晰,推荐看一下 http://blog.csdn.net/v_july_v/article/details/7041827

  7. 洛谷P3375 - 【模板】KMP字符串匹配

    原题链接 Description 模板题啦~ Code //[模板]KMP字符串匹配 #include <cstdio> #include <cstring> int cons ...

  8. P3375 模板 KMP字符串匹配

    P3375 [模板]KMP字符串匹配 来一道模板题,直接上代码. #include <bits/stdc++.h> using namespace std; typedef long lo ...

  9. KMP字符串匹配学习

    KMP字符串匹配学习 牛逼啊 SYC大佬的博客

随机推荐

  1. http状态码301和302的区别

    1.官方的比较简洁的说明: 301 redirect: 301 代表永久性转移(Permanently Moved) 302 redirect: 302 代表暂时性转移(Temporarily Mov ...

  2. SQL注入之Sqli-labs系列第二十四关(二阶注入)

    开始挑战第二十四关(Second Degree Injections) 0x1 前言 SQL注入一般分为两类:一阶SQL注入(普通SQL注入),二阶SQL注入 .二次注入不是注入两次的意思,请不要混淆 ...

  3. 2.10 select下拉框

    2.10 select下拉框 本篇以百度设置下拉选项框为案例,详细介绍select下拉框相关的操作方法. 一.认识select    1.打开百度-设置-搜索设置界面,如下图所示 2.箭头所指位置,就 ...

  4. dblogin userid ogg ERROR: Unable to connect to database using user ogg

    测试环境,初步配置ogg,添加ogg用户连接数据库,提示无权限报错. 1.0 报错信息 GGSCI (enmo) > dblogin userid ogg,password ogg ERROR: ...

  5. Javascript class获取回调函数数据

    /********************************************************************** * Javascript class获取回调函数数据 * ...

  6. 【err】VIDEOIO ERROR: V4L: index 0 is not correct!Unable to connect to camera

    前言 新到手一块板子,程序编译成功之后,运行出现错误,不能连接到摄像头. 问题 VIDEOIO ERROR: V4L: index is not correct! Unable to connect ...

  7. (1)什么是web框架和http协议

    Django是一个web框架 web框架的本质:就是一个socket服务端 bs架构本质上就是cs架构(cs架构就是client和server):bs架构就是browser和server,本质上bro ...

  8. js验证后台传递的map数据是否为空

    if(JSON.stringify(data)=='{}'){ $("#year").append("<option>--请选择--</option&g ...

  9. Go Example--关闭通道

    package main import ( "fmt" ) func main() { jobs := make(chan int, 5) done := make(chan bo ...

  10. 【HAOI2016】放旗子

    终于自己推出来一道题了quq然而时间有点久,考场上并不大丈夫……原题: 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍 ...