字符串的查找KMP
基本思想,当出现不匹配的时候,就知晓一部分文本内容(因为在匹配失败前已经发生匹配)
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的更多相关文章
- c算法:字符串查找-KMP算法
/* *用KMP算法实现字符串匹配搜索方法 *该程序实现的功能是搜索本目录下的所有文件的内容是否与给定的 *字符串匹配,如果匹配,则输出文件名:包含该字符串的行 *待搜索的目标串搜索指针移动位数 = ...
- 字符串匹配算法之kmp算法
kmp算法是一种效率非常高的字符串匹配算法,是由Knuth,Morris,Pratt共同提出的模式匹配算法,所以简称KMP算法 算法思想 在一个字符串中查找另一个字符串时,会遇到如下图的情况 我们通常 ...
- Python 细聊从暴力(BF)字符串匹配算法到 KMP 算法之间的精妙变化
1. 字符串匹配算法 所谓字符串匹配算法,简单地说就是在一个目标字符串中查找是否存在另一个模式字符串.如在字符串 "ABCDEFG" 中查找是否存在 "EF" ...
- [算法2-数组与字符串的查找与匹配] (.NET源码学习)
[算法2-数组与字符串的查找与匹配] (.NET源码学习) 关键词:1. 数组查找(算法) 2. 字符串查找(算法) 3. C#中的String(源码) 4. 特性Attribute 与内 ...
- Matlab 之 字符串数组查找
Matlab的优势在于向量操作,字符串操作往往费时费力,但是如果能充分利用Matlab自带的一些函数,也可以取得不错的效果.下面就介绍一下字符串数组查找的小技巧. 字符串数组我通常会选择应用cell格 ...
- C#:比较二个字符串,查找出相同字数和差异字符
;; i < n; i++) { ) == s2.Substring(i, )) /*同位 ...
- 数据结构学习之字符串匹配算法(BF||KMP)
数据结构学习之字符串匹配算法(BF||KMP) 0x1 实验目的 通过实验深入了解字符串常用的匹配算法(BF暴力匹配.KMP.优化KMP算法)思想. 0x2 实验要求 编写出BF暴力匹配.KM ...
- 1.3 正则表达式和Python语言-1.3.5使用 search()在一个字符串中查找模式(搜索与匹配 的对比)
1.3.5 使用 search()在一个字符串中查找模式(搜索与匹配的对比) 其实,想要搜索的模式出现在一个字符串中间部分的概率,远大于出现在字符串起始部分的概率.这也就是 search()派上用场的 ...
- ZT 输入一个字符串,查找它的第一个数字串,并返回其个数
/*查找字符串中的数字串问题 输入一个字符串,查找它的第一个数字串,并返回其个数 */ #include <stdio.h> char firstnum(char *input,char ...
随机推荐
- mysql练习----SUM and COUNT/zh图(二)
世界国家概况 GROUP BY 和 HAVING 通过包括一个GROUP BY子句功能, SUM并将COUNT 其应用于共享值的项目组.当你指定 GROUP BY continent 结果是每个不同的 ...
- [20181015]12C SQL Translation Framework.txt
[20181015]12C SQL Translation Framework.txt --//12c提供一个dba改写sql语句的可能性,实际上10g,11g之前也有一个包DBMS_ADVANCED ...
- web前端(2)—— 前端技术介绍
前端技术 前文了解了什么是前端,那么前端技术到底有哪些呢?最核心的就这三个: html/html5 css/css3 javascript 什么是HTML HyperText Markup Langu ...
- Greenplum源码安装(CentOS 7)
最近在看GP,在安装集群的时候遇到了很多问题,在此记录下来. 目录 1 安装环境及软件版本 2 安装准备工作 2.1 修改hosts(所有机器) 2.2 修改系统内核配置(所有机器) 2.3 关闭 ...
- Win10 C盘桌面文件右上方的两个蓝色箭头解决方案
之前看网上有很多桌面蓝色箭头的解决方案,也进行了一些尝试 可是每次Win10系统更新之后蓝色箭头就会重新显示. 最终方案:将建立在桌面的C盘文件移到D盘,桌面创建对应的快捷方式. 一劳永逸,暴力破解.
- CentOS 7.0安装
CentOS 7.0安装 本次通过虚拟机的方法安装CentOS 7.0操作系统,开启虚拟机后会出现以下界面 1.选择第一项,Install CentOS 7 (安装CentOS 7),进入下面的界面 ...
- Linux 小知识翻译 - 「邮件服务器」
这次聊聊「邮件服务器」. 邮件服务器上通常会运行2个服务端软件,「SMTP服务器」和「POP服务器或者IMAP服务器」. 这2个东西,也许使用邮件客户端的人立马就明白了.因为设置邮件客户端的时候,需要 ...
- MySql 中文写入数据库乱码及Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1解决
一.中文写入乱码问题 我输入的中文编码是 urf8 的,建的库是 urf8 的,但是插入MySQL总是乱码,一堆"???????????????????????".可以使用以下的方 ...
- VS的快捷键汇总
C#中的快捷键,可以更方便的编写代码 CTRL + SHIFT + B 生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL + SHIFT + O 打开项目 CTRL + ...
- 轮播图插件swiper 的使用
引入文件(注:目前版本号为Swiper3.x) <link rel="stylesheet" type="text/css" href="//s ...