字符串的查找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 ...
随机推荐
- Windows Server 2016-Powershell管理站点复制
对于Active Directory的Windows PowerShell包括管理复制.网站.域和森林,域控制器以及分区的能力.例如Active Directory的站点和服务管理单元和repadmi ...
- 介绍一个比较了各种浏览器对于HTML5 等标准支持程度的网站
可以选择浏览器种类,版本,比较的功能 网站地址:https://caniuse.com/#comparison
- LeetCode算法题-Number of 1 Bits(Java实现)
这是悦乐书的第186次更新,第188篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第45题(顺位题号是191).编写一个带无符号整数的函数,并返回它所具有的"1 ...
- Java入门(七):方法
方法,在日常生活中可以理解成解决问题或处理事情的技巧,一个方法的形成,需要思考和分析,从而形成一步一步的步骤,最后在实际执行过程中验证自己的思路.在Java中,方法的形成亦是如此. 方法,指用于封装一 ...
- voinc+vue实现级联选择
需求: vonic中实现级联选择 <!DOCTYPE html> <html> <head> <title>下拉框</title> < ...
- MySQL 目录结构、配置文件、修改密码
查看全局数据文件路径 show global variables like "%datadir%" 一.文件目录结构 文件安装路径为F:/JJ/MYSQL-5.6.42-WINX6 ...
- 【NOI2018模拟5】三角剖分Bsh
[NOI2018模拟5]三角剖分Bsh Description 给定一个正 n 边形及其三角剖分,共 2n - 3 条边 (n条多边形的边和n-3 条对角线),每条边的长度为 1. 共 q 次询问,每 ...
- C#深度学习の枚举类型(IEnumerator,IEnumerable)
一.关于枚举的含义 .Net提供了可枚举类型的接口IEnumerable和枚举器接口IEnumerator,程序集System.Collections 另: IQueryable 继承自IEnumer ...
- 并发的HashMap为什么会引起死循环?
转载:http://blog.csdn.net/zhuqiuhui/article/details/51849692 今天研读Java并发容器和框架时,看到为什么要使用ConcurrentHashMa ...
- Linux中的零拷贝技术
转载:https://www.jianshu.com/p/fad3339e3448 引文## 在写一个服务端程序时(Web Server或者文件服务器),文件下载是一个基本功能.这时候服务端的任务是: ...