字符串的查找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 ...
随机推荐
- c/c++ 图的创建及图的相关函数(链表法)
c/c++ 图的创建及图的相关函数(链表法) 图的概念 图由点和线组成 知道了图中有多少个点,和哪些点之间有线,就可以把一张图描绘出来 点之间的线,分有方向和无方向 创建图 创建图,实际就是创建出节点 ...
- python列表与元组的用法
python列表与元组的用法 目录: 列表的用法: 1.增 append + extend 2.删 del remove 3.改 insert 4.查 index 5.反向 ...
- Windows单机最大TCP连接数的问题
本文和大家分享一下Windows下单机最大TCP连接数,因为在做Socket 编程时,我们经常会要问,单机最多可以建立多少个 TCP 连接,本文将介绍如何调整系统参数来调整单机的最大TCP连接数. W ...
- appium+robotframework常见技巧总结
1.如何输入中文 方法: 在open application参数最后,新增unicodeKeyboard=True resetKeyboard=True:不加入这两个参数时,中文无法输入 2.如 ...
- Zookeeper Health Checks
Short Description: The article talks about the basic health checks to be performed when working on i ...
- ES5-ES6-ES7_iterator和for of
iterator(遍历器)的概念 JavaScript原有的表示“集合”的数据结构,主要是数组(Array)和对象(Object),ES6又添加了Map和Set.这样就有了四种数据集合,用户还可以组合 ...
- Java面试知识点之数据库篇(一)
前言:数据库的相关知识,在面试中也经常出现,笔者认为非常有必要对此类知识进行相关总结. 1.索引 索引是对数据库表中一列或多列的值进行排序的结构,是帮助数据库高效获取数据的数据结构. 通俗理解:索引就 ...
- 【CQOI2011】放棋子
[CQOI2011]放棋子 在一个n行m列的棋盘里放一些彩色的棋子,使得每个格子最多放一个棋子,且不同颜色的棋子不能在同一行或者同一列.有多少种方法? 例如\(,n=m=3\),有两个白棋子和一个灰棋 ...
- [python] 解决pip install download速度过慢问题 更换豆瓣源
""" python建立pip.ini.py 2016年4月30日 03:35:11 codegay """ import os ini=& ...
- o.s.b.d.LoggingFailureAnalysisReporter
1.错误信息 *************************** APPLICATION FAILED TO START *************************** Descripti ...