字符串匹配算法之————KMP算法
上一篇中讲到暴力法字符串匹配算法,但是暴力法明显存在这样一个问题:一次只移动一个字符。但实际上,针对不同的匹配情况,每次移动的间隔可以更大,没有必要每次只是移动一位:
关于KMP算法的描述,推荐一篇博客:https://blog.csdn.net/weixin_36604953/article/details/78576637
该博客详细的描述了KMP算法原理。下面的代码实现了KMP算法:
//使用暴力穷举法, KMP算法完成字符串匹配算法
# include "iostream"
#include"string"
#include"vector"
using namespace std;
vector<int>& BFmatch(string & , string & , vector<int>&);
vector<int>& KMPStrMatch(string &, string &, vector<int>&);
void ShowPos(vector<int>& );
int main()
{
string ModelStr, SonStr;
vector<int> pos;
cout << "请输入待匹配字符串:";
cin >> ModelStr ;
cout << endl;
cout << "请输入子字符串:";
cin >> SonStr;
cout << endl;
//BFmatch(ModelStr, SonStr, pos);
KMPStrMatch(ModelStr, SonStr, pos);
ShowPos(pos);
system("pause");
}
vector<int>& BFmatch(string & ModelStr, string & SonStr,vector<int>& pos)
{
for (int i = ; i < ModelStr.size(); i++)
{
int k = ;
for (int j = i; k < SonStr.size(); j++, k++)
{
if (SonStr[k] == ModelStr[j])
continue;
else
break;
}
if (k == SonStr.size())
pos.push_back(i);
}
return pos;
}
void ShowPos(vector<int>& pos)
{
if (pos.size() != )
{
cout << "the first position of MatchingStr:";
for (int i = ; i < pos.size(); i++)
{
cout << pos[i] << "\t";
}
cout << endl;
}
else
cout << "no such string!" << endl;
}
vector<int>& KMPStrMatch(string & ModelStr, string & SonStr, vector<int>& pos)
{
string ComStr;
string tmp1, tmp2;
int j = , i = , len = ;;
while(j< (ModelStr.size()- SonStr.size()+))
{
if (ModelStr[j] != SonStr[])
{
j++;
continue;//首位不匹配直接加1
}
else
{
while ((j< ModelStr.size())&&(ModelStr[j] == SonStr[i]))//&&前面的约束条件保证了不会发生内存越界
{
j++;
i++;
}
if (i == SonStr.size())
pos.push_back(j - SonStr.size());
j = j - i;
ComStr = SonStr.substr(, i - );
for (int q = ; q < ComStr.size(); q++)
{
tmp1=ComStr.substr(q, ComStr.size() - );
tmp2=ComStr.substr(, ComStr.size() - - q);
if (tmp1 == tmp2)
len++;
}
j = j + i-len;
i = ;
len = ;
}
}
return pos;
}
总之,KMP的核心思想在于:通过部分匹配字符串的长度来决定待匹配字符串的移动长度,而不是每次只是移动一位。
字符串匹配算法之————KMP算法的更多相关文章
- 字符串匹配算法之 kmp算法 (python版)
		
字符串匹配算法之 kmp算法 (python版) 1.什么是KMP算法 KMP是三位大牛:D.E.Knuth.J.H.MorriT和V.R.Pratt同时发现的.其中第一位就是<计算机程序设计艺 ...
 - 动画演示Sunday字符串匹配算法——比KMP算法快七倍!极易理解!
		
前言 上一篇我用动画的方式向大家详细说明了KMP算法(没看过的同学可以回去看看). 这次我依旧采用动画的方式向大家介绍另一个你用一次就会爱上的字符串匹配算法:Sunday算法,希望能收获你的点赞关注收 ...
 - 字符串匹配算法之kmp算法
		
kmp算法是一种效率非常高的字符串匹配算法,是由Knuth,Morris,Pratt共同提出的模式匹配算法,所以简称KMP算法 算法思想 在一个字符串中查找另一个字符串时,会遇到如下图的情况 我们通常 ...
 - 字符串匹配算法(三)-KMP算法
		
今天我们来聊一下字符串匹配算法里最著名的算法-KMP算法,KMP算法的全称是 Knuth Morris Pratt 算法,是根据三位作者(D.E.Knuth,J.H.Morris 和 V.R.Prat ...
 - Python 细聊从暴力(BF)字符串匹配算法到 KMP 算法之间的精妙变化
		
1. 字符串匹配算法 所谓字符串匹配算法,简单地说就是在一个目标字符串中查找是否存在另一个模式字符串.如在字符串 "ABCDEFG" 中查找是否存在 "EF" ...
 - 数据结构学习之字符串匹配算法(BF||KMP)
		
数据结构学习之字符串匹配算法(BF||KMP) 0x1 实验目的  通过实验深入了解字符串常用的匹配算法(BF暴力匹配.KMP.优化KMP算法)思想. 0x2 实验要求  编写出BF暴力匹配.KM ...
 - 字符串匹配算法之Sunday算法(转)
		
字符串匹配算法之Sunday算法 背景 我们第一次接触字符串匹配,想到的肯定是直接用2个循环来遍历,这样代码虽然简单,但时间复杂度却是Ω(m*n),也就是达到了字符串匹配效率的下限.于是后来人经过研究 ...
 - 字符串匹配算法之BM算法
		
BM算法,全称是Boyer-Moore算法,1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了一种新的字符串匹配算法. BM算法定义了两个规则: ...
 - 数据结构4_java---顺序串,字符串匹配算法(BF算法,KMP算法)
		
1.顺序串 实现的操作有: 构造串 判断空串 返回串的长度 返回位序号为i的字符 将串的长度扩充为newCapacity 返回从begin到end-1的子串 在第i个字符之前插入字串str 删除子串 ...
 
随机推荐
- 个人永久性免费-Excel催化剂功能第99波-手机号码归属地批量查询
			
高潮过往趋于平静,送上简单的手机号码归属地查询,因接口有数量限制,仅能满足少量数据需求,如有大规模数据却又想免费获得,这就成为无解了,数据有价,且用且珍惜. 业务使用场景 除了日常自带的手机各种管家为 ...
 - 个人永久性免费-Excel催化剂功能第91波-地图数据挖宝之行政区域信息实时下载(含经纬度)
			
移动互联网和O2O兴起的这十年时间里,由地图LBS功能衍生出一大堆的极高商业价值的数据及应用,地图相关的数据,也是数据分析过程中一个大宝藏,从此篇开始将带给大家一系列的地图相关的数据采集,满足数据分析 ...
 - fjnuoj 1003 学长的QQ号
			
题目: //QQ是一个9位数,由1,2,3,4,5,9组成,且第1.6位数字相同,第2.4位数字相同,第5.7位数字相同. //我的QQ就在符合上诉条件中的所有9位数从小到大排第 ...
 - Tomcat(Windows)
			
百度云:链接:http://pan.baidu.com/s/1pKYrf79 密码:56t0 官网下载网址:http://archive.apache.org/dist/tomcat/tomca ...
 - NetCore跨平台桌面框架Avalonia的OSX程序打包
			
虽然工作开发语言已经转到了java,但平时仍会用netcore做一些小工具,提升工作效率,但是笔记本换成了Mac,小工具只能做成命令行形式,很是痛苦,迫切需要一个.net跨平台的桌面程序解决方案. 为 ...
 - JAVA遍历机制的性能的比较
			
本文首发于cartoon的博客 转载请注明出处:https://cartoonyu.github.io/cartoon-blog/post/java/java%E9%81%8D%E5% ...
 - spring与mybatis整合(扫描Mapper接口)
			
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" ...
 - Java连载10-数据类型取值范围&转义字符
			
一.数据类型取值范围 二.八种数据类型在成员变量中的默认值 (1)成员变量,没有赋值,编译不会报错,系统会自动给赋值 byte\int\short\long默认值为0:float\double默认值为 ...
 - JAVA-Spring AOP基础 - 代理设计模式
			
利用IOC DI实现软件分层,虽然解决了耦合问题,但是很多地方仍然存在非该层应该实现的功能,造成了无法“高内聚”的现象,同时存在大量重复的代码,开发效率低下. @Service public clas ...
 - 用机智云做PWM占空比控制电机,物联网智能家居应用
			
因为是新申请的博客,所以申请了总想往里面加点东西,所以把我之前在机智云写的帖子复制了过来 (各位抱歉,由于之前上传的文件可能有错误,之前上传的文件PWM不能用,那么我又重新上传了一个文件,这个文件 ...