基本思想,当出现不匹配的时候,就知晓一部分文本内容(因为在匹配失败前已经发生匹配)

P[0 ~ k-1] == P[j-k ~ j-1]

//KMP
#include<iostream>
#include<string.h>
#include<malloc.h>
using namespace std;
void come(string pattern,int next[]){
int i=;
int j=-;
const int m=pattern.length();
next[]=j;//第一个为0
for(int i=;i<m;i++){
while(j>-&&pattern[j+]!=pattern[i]) j=next[j]; //恢复0 恢复的地方
if(pattern[i]==pattern[j+]) j++;
next[i]=j;
}
}
/*void com(const char *pattern,int next[]){ //当匹配后跳转的地方next[i]----->pattern[j]
int i=1;
int j=-1;
const int m=strlen(pattern);
next[0]=j;//第一个为0 for(int i=1;i<m;i++){
while(j>-1&&pattern[j+1]!=pattern[i]) j=next[j]; //恢复0 恢复的地方
if(pattern[i]==pattern[j+1]) j++;
next[i]=j;
}
} */
/*int kmp(const char *text,const char *pattern){
int i;
int j=-1;
const int n=strlen(text);
const int m=strlen(pattern);
if(n==0&&m==0) return 0;
if(m==0) return 0;
int *next=(int*)malloc(sizeof(int)*m);
com(pattern,next);
for(i=0;i<n;i++) {
while(j>-1&&pattern[j+1]!=text[i]) j=next[j];
if(text[i]==pattern[j+1]) j++;
if(j==m-1) {
free(next);
return i-j;
}
}
free(next);
return -1;
}*/
int Kmp(string text,string pattern){
int i;
int j=-;
const int n=text.length();
const int m=pattern.length();
if(n==&&m==) return ;
if(m==) return ;
int next[m];
come(pattern,next);
for(i=;i<n;i++) {
while(j>-&&pattern[j+]!=text[i]) j=next[j];
if(text[i]==pattern[j+]) j++;
if(j==m-) {
// free(next);
return i-j;
}
}
// free(next);
return -;
}
int main()
{
// char text[]="ABC ABCDA ABCDABCDABCDABDE";
// char pattern[]="ABCDABD";
// char *ch=text;
string text="ABC ABCDA ABCDABCDABCDABDE";
string pattern="ABCDABD";
int i=Kmp(text,pattern);
// if(i>=0) printf("%s\n",ch+i);
cout<<i<<endl;
return ;
}

我不晓得看了多少次kmp算法了,感觉还是要写博客,不然的话算法这个东西,太容易忘记了。。。

分析:

文本字符串长度为n,模式串长度为m,创建数组next[0...m-1],做一个标记,是对自身的标记

//KMP
#include<iostream>
#include<string.h>
#include<malloc.h>
using namespace std;
void come(string pattern,int next[]){
int i=;
int j=-;
const int m=pattern.length();
next[]=j;//第一个为-1 0-(-1)==1 转移1
for(int i=;i<m;i++){
while(j>-&&pattern[j+]!=pattern[i]) j=next[j]; //恢复0 恢复的地方
if(pattern[i]==pattern[j+]) j++;
next[i]=j;
}
} int Kmp(string text,string pattern){
int i;
int j=-;
const int n=text.length();
const int m=pattern.length();
if(n==&&m==) return ;
if(m==) return ;
int next[m];
come(pattern,next);
for(i=;i<n;i++) {
if(j>-&&pattern[j+]!=text[i]) j=next[j];
if(text[i]==pattern[j+]) j++;
if(j==m-)
return i-j;
}
return -;
}
int main()
{
string text="ABC ABCDA ABCDABCDABCDABDE";
string pattern="ABCDABD";
int i=Kmp(text,pattern);
cout<<i<<endl;
return ;
}

测试数据:

ABC ABCDA ABCDABCDABCDABDE
ABCDABD

字符串的查找KMP的更多相关文章

  1. c算法:字符串查找-KMP算法

    /* *用KMP算法实现字符串匹配搜索方法 *该程序实现的功能是搜索本目录下的所有文件的内容是否与给定的 *字符串匹配,如果匹配,则输出文件名:包含该字符串的行 *待搜索的目标串搜索指针移动位数 = ...

  2. 字符串匹配算法之kmp算法

    kmp算法是一种效率非常高的字符串匹配算法,是由Knuth,Morris,Pratt共同提出的模式匹配算法,所以简称KMP算法 算法思想 在一个字符串中查找另一个字符串时,会遇到如下图的情况 我们通常 ...

  3. Python 细聊从暴力(BF)字符串匹配算法到 KMP 算法之间的精妙变化

    1. 字符串匹配算法 所谓字符串匹配算法,简单地说就是在一个目标字符串中查找是否存在另一个模式字符串.如在字符串 "ABCDEFG" 中查找是否存在 "EF" ...

  4. [算法2-数组与字符串的查找与匹配] (.NET源码学习)

    [算法2-数组与字符串的查找与匹配] (.NET源码学习) 关键词:1. 数组查找(算法)   2. 字符串查找(算法)   3. C#中的String(源码)   4. 特性Attribute 与内 ...

  5. Matlab 之 字符串数组查找

    Matlab的优势在于向量操作,字符串操作往往费时费力,但是如果能充分利用Matlab自带的一些函数,也可以取得不错的效果.下面就介绍一下字符串数组查找的小技巧. 字符串数组我通常会选择应用cell格 ...

  6. C#:比较二个字符串,查找出相同字数和差异字符

            ;; i < n; i++)             {                 ) == s2.Substring(i, ))                 /*同位 ...

  7. 数据结构学习之字符串匹配算法(BF||KMP)

    数据结构学习之字符串匹配算法(BF||KMP) 0x1 实验目的 ​ 通过实验深入了解字符串常用的匹配算法(BF暴力匹配.KMP.优化KMP算法)思想. 0x2 实验要求 ​ 编写出BF暴力匹配.KM ...

  8. 1.3 正则表达式和Python语言-1.3.5使用 search()在一个字符串中查找模式(搜索与匹配 的对比)

    1.3.5 使用 search()在一个字符串中查找模式(搜索与匹配的对比) 其实,想要搜索的模式出现在一个字符串中间部分的概率,远大于出现在字符串起始部分的概率.这也就是 search()派上用场的 ...

  9. ZT 输入一个字符串,查找它的第一个数字串,并返回其个数

    /*查找字符串中的数字串问题 输入一个字符串,查找它的第一个数字串,并返回其个数 */ #include <stdio.h> char firstnum(char *input,char ...

随机推荐

  1. c/c++ 图的创建及图的相关函数(链表法)

    c/c++ 图的创建及图的相关函数(链表法) 图的概念 图由点和线组成 知道了图中有多少个点,和哪些点之间有线,就可以把一张图描绘出来 点之间的线,分有方向和无方向 创建图 创建图,实际就是创建出节点 ...

  2. python列表与元组的用法

    python列表与元组的用法 目录: 列表的用法: 1.增   append   +    extend 2.删  del    remove 3.改   insert 4.查  index 5.反向 ...

  3. Windows单机最大TCP连接数的问题

    本文和大家分享一下Windows下单机最大TCP连接数,因为在做Socket 编程时,我们经常会要问,单机最多可以建立多少个 TCP 连接,本文将介绍如何调整系统参数来调整单机的最大TCP连接数. W ...

  4. appium+robotframework常见技巧总结

    1.如何输入中文 方法: 在open application参数最后,新增unicodeKeyboard=True    resetKeyboard=True:不加入这两个参数时,中文无法输入 2.如 ...

  5. Zookeeper Health Checks

    Short Description: The article talks about the basic health checks to be performed when working on i ...

  6. ES5-ES6-ES7_iterator和for of

    iterator(遍历器)的概念 JavaScript原有的表示“集合”的数据结构,主要是数组(Array)和对象(Object),ES6又添加了Map和Set.这样就有了四种数据集合,用户还可以组合 ...

  7. Java面试知识点之数据库篇(一)

    前言:数据库的相关知识,在面试中也经常出现,笔者认为非常有必要对此类知识进行相关总结. 1.索引 索引是对数据库表中一列或多列的值进行排序的结构,是帮助数据库高效获取数据的数据结构. 通俗理解:索引就 ...

  8. 【CQOI2011】放棋子

    [CQOI2011]放棋子 在一个n行m列的棋盘里放一些彩色的棋子,使得每个格子最多放一个棋子,且不同颜色的棋子不能在同一行或者同一列.有多少种方法? 例如\(,n=m=3\),有两个白棋子和一个灰棋 ...

  9. [python] 解决pip install download速度过慢问题 更换豆瓣源

    """ python建立pip.ini.py 2016年4月30日 03:35:11 codegay """ import os ini=& ...

  10. o.s.b.d.LoggingFailureAnalysisReporter

    1.错误信息 *************************** APPLICATION FAILED TO START *************************** Descripti ...