【算法】串的模式匹配算法(KMP)
串的模式匹配算法
问题:
求子串位置的定位函数如何写? int index(SString S,SString T,int pos);
给定串S,子串T,问T在S中从pos位开始第一次出现的位置是?我没有使用字符数组或者string,而是自己实现SString,(这其实是数据结构作业)。S[0]中存放的是串的长度。
方法一:大暴力
#include<iostream>
#include<cstdio>
#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN+]; //串的数组表示;注意: 0号存放串的实际长度,故这里是MAXSTRLEN+1
using namespace std;
/*方法一:最简单的直接暴力 复杂度O(len(S)*len(T))*/
int Index_simpal(SString S,SString T,int pos){
int i = pos;
int j = ;
while(i<=S[]&&j<=T[]){
if(S[i] == T[i]){
++i;
++j;
}else{
//一旦匹配不上,子串从头开始找,S串从上一次开始匹配的下一个位置开始找
j = ;
i = i - (j-) + ; //i是S串当前位置,j-1是当前匹配上的字符,i-(j-1)即上一次开始匹配的位置,+1即下一个位置
}
}
if(j>T[]){
//说明找到了
return i-T[]; //第一次匹配上的下标,注意这里面所有下标都是自然计数(0存长度)
}
return ;
}
方法二:KMP算法
维护一个next数组,next[i] 是下标1到i之间的串的最大公共前缀后缀长度+1;
在方法一的基础上,不把子串重新遍历,而是从next[j] 处遍历;
母串S不从上一次开始匹配的地方开始,而是从当前位置继续;
具体看代码以及注释:
/*
当不匹配时,不把i从上一次开始匹配的下一位开始寻找,而是从当前位开始寻找
而子串j下标,不从头开始,而是从最大公共前后缀长度的下一位开始寻找
这里引入最大公共前后缀的概念 当前匹配点之前的前、后缀相同的最大数值
next数组就是+1
自然计数
next[1] = 0;
*/
#include<iostream>
#include<cstdio>
#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN+]; //串的数组表示;注意: 0号存放串的实际长度,故这里是MAXSTRLEN+1
using namespace std;
int next[];
void get_next(SString T) {
next[] = ;
int i = ;
int j = ;
//遍历T
while(i<T[]) {
if(j == ||T[i] == T[j]){
++i;
++j;
next[i] = j;
}else{
j = next[j];
}
}
} int Index_KMP(SString S,SString T,int pos){
int i = pos;
int j = ;
while(i<=S[]&&j<=T[]){
if(j == ||S[i] == T[j]){
++i;
++j;
}else{
j = next[j]; //从第next[j]处开始找
}
}
if(j>T[]){
//说明找到了
return i-T[]; //第一次匹配上的下标,注意这里面所有下标都是自然计数(0存长度)
}
else return ;
} int main(){
SString s1 = "5abccd";
SString s2 = "2cd";
get_next(s1);
int ans = Index_KMP(s1,s2,);
printf("%d",ans);
}
【算法】串的模式匹配算法(KMP)的更多相关文章
- 《数据结构》之串的模式匹配算法——KMP算法
//串的模式匹配算法 //KMP算法,时间复杂度为O(n+m) #include <iostream> #include <string> #include <cstri ...
- 串的模式匹配算法 ------ KMP算法
//KMP串的模式匹配算法 #include <stdio.h> #include <stdlib.h> #include <string.h> int* get_ ...
- 数据结构- 串的模式匹配算法:BF和 KMP算法
数据结构- 串的模式匹配算法:BF和 KMP算法 Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...
- 串、串的模式匹配算法(子串查找)BF算法、KMP算法
串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3…….an ' n ...
- 【Java】 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)
本文根据<大话数据结构>一书,实现了Java版的串的朴素模式匹配算法.KMP模式匹配算法.KMP模式匹配算法的改进算法. 1.朴素的模式匹配算法 为主串和子串分别定义指针i,j. (1)当 ...
- 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)
--喜欢记得关注我哟[shoshana]-- 目录 1.朴素的模式匹配算法2.KMP模式匹配算法 2.1 KMP模式匹配算法的主体思路 2.2 next[]的定义与求解 2.3 KMP完整代码 2.4 ...
- 串的模式匹配算法1 BF算法
BF算法 字符串的模式匹配不一定要从主串的第一个位置开始,可以指定主串中查找的起始位置 pos. 2. 算法步骤: 1)分别利用计数器指针 i 和 j 指定主串和模式串即小字符串待比较的位置,初始化为 ...
- 串的模式匹配算法(求子串位置的定位函数Index(S,T,pos))
串的模式匹配的一般方法如算法4.5(在bo4-1.cpp 中)所示:由主串S 的第pos 个字 符起,检验是否存在子串T.首先令i 等于 pos(i 为S 中当前待比较字符的位序),j 等于 1(j ...
- 字符串的模式匹配算法——KMP模式匹配算法
朴素的模式匹配算法(C++) 朴素的模式匹配算法,暴力,容易理解 #include<iostream> using namespace std; int main() { string m ...
随机推荐
- 02-vue学习篇-以正确的姿势使用vue
1.渲染数据 #view层 <div class="hello"> <h1>{{ msg }}</h1> //msg </div> ...
- JVM调优常用参数和注意点备忘录
本文主要是工作过程中总结的一些jvm调优的参数和注意的地方,作为一个备忘录,先占个坑,有时间在来细化具体的实例. gc日志是覆盖的方式如果文件名字固定会导致上一次被覆盖可以采用这个-Xloggc:ba ...
- 黑客帝国效果赏析(包含ES6的语法)
首先,看看效果吧. 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- sql定时备份
老规矩,直接上代码: ) set @name='C:\Backup\MyStudy_'+ ),)+'.bak' BACKUP DATABASE[MyStudy]TO DISK=@name WITH N ...
- gnuplot画折线图
之前尝试用jfreechart画自定义横坐标的折线图或时序图,发现很复杂,后来改用gnuplot了. gnuplot在网上一搜就能找到下载地址. 安装完成后,主要是命令行形式的交互界面,至少比jfre ...
- 为github添加ssh key
用git关联github上的远程仓库前需要先为github添加ssh key 一.检查本机是否生成ssh key 本地查找.ssh文件,其中id_rsa.pub中的内容就是ssh key 二.为git ...
- Apache Tomcat® - Which Version Do I Want?
Apache Tomcat® - Which Version Do I Want?http://tomcat.apache.org/whichversion.html
- How to Configure Email Notification in Jenkins
How to Configure Email Notification in Jenkins? - The Official 360logica Bloghttps://www.360logica.c ...
- Oracle 同义词(Synonym)
同义词(Synonym)是表.索引.视图等模式对象的一个别名.通过模式对象创建同义词,可以隐藏对象的实际名称和所有者信息,隐藏分布式数据库中远程对象的设置信息,由此为对象提提供一定的安全性保证.同义词 ...
- Azure系列2.1.8 —— BlockEntry
(小弟自学Azure,文中有不正确之处,请路过各位大神指正.) 网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习 ...