上一篇中讲到暴力法字符串匹配算法,但是暴力法明显存在这样一个问题:一次只移动一个字符。但实际上,针对不同的匹配情况,每次移动的间隔可以更大,没有必要每次只是移动一位:

关于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算法的更多相关文章

  1. 字符串匹配算法之 kmp算法 (python版)

    字符串匹配算法之 kmp算法 (python版) 1.什么是KMP算法 KMP是三位大牛:D.E.Knuth.J.H.MorriT和V.R.Pratt同时发现的.其中第一位就是<计算机程序设计艺 ...

  2. 动画演示Sunday字符串匹配算法——比KMP算法快七倍!极易理解!

    前言 上一篇我用动画的方式向大家详细说明了KMP算法(没看过的同学可以回去看看). 这次我依旧采用动画的方式向大家介绍另一个你用一次就会爱上的字符串匹配算法:Sunday算法,希望能收获你的点赞关注收 ...

  3. 字符串匹配算法之kmp算法

    kmp算法是一种效率非常高的字符串匹配算法,是由Knuth,Morris,Pratt共同提出的模式匹配算法,所以简称KMP算法 算法思想 在一个字符串中查找另一个字符串时,会遇到如下图的情况 我们通常 ...

  4. 字符串匹配算法(三)-KMP算法

    今天我们来聊一下字符串匹配算法里最著名的算法-KMP算法,KMP算法的全称是 Knuth Morris Pratt 算法,是根据三位作者(D.E.Knuth,J.H.Morris 和 V.R.Prat ...

  5. Python 细聊从暴力(BF)字符串匹配算法到 KMP 算法之间的精妙变化

    1. 字符串匹配算法 所谓字符串匹配算法,简单地说就是在一个目标字符串中查找是否存在另一个模式字符串.如在字符串 "ABCDEFG" 中查找是否存在 "EF" ...

  6. 数据结构学习之字符串匹配算法(BF||KMP)

    数据结构学习之字符串匹配算法(BF||KMP) 0x1 实验目的 ​ 通过实验深入了解字符串常用的匹配算法(BF暴力匹配.KMP.优化KMP算法)思想. 0x2 实验要求 ​ 编写出BF暴力匹配.KM ...

  7. 字符串匹配算法之Sunday算法(转)

    字符串匹配算法之Sunday算法 背景 我们第一次接触字符串匹配,想到的肯定是直接用2个循环来遍历,这样代码虽然简单,但时间复杂度却是Ω(m*n),也就是达到了字符串匹配效率的下限.于是后来人经过研究 ...

  8. 字符串匹配算法之BM算法

    BM算法,全称是Boyer-Moore算法,1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了一种新的字符串匹配算法. BM算法定义了两个规则: ...

  9. 数据结构4_java---顺序串,字符串匹配算法(BF算法,KMP算法)

    1.顺序串 实现的操作有: 构造串 判断空串 返回串的长度 返回位序号为i的字符 将串的长度扩充为newCapacity 返回从begin到end-1的子串 在第i个字符之前插入字串str 删除子串 ...

随机推荐

  1. 个人永久性免费-Excel催化剂功能第31波-数量金额分组凑数功能,财务表哥表姐最爱

    在财务工作过程中,很大时候需要使用到凑数的需求,花了两三天时间认真研究了一下,本人水平也只能做代码搬运工,在用户体验上作了一下完善.完成了Excel版的凑数功能. 文章出处说明 原文在简书上发表,再同 ...

  2. CentOS下配置apache+gitweb

    GitWeb支持多个版本库,可以对多个版本库进行目录浏览(包括历史版本),可以查看文件内容,查看提交历史,提供搜索及 RSS feed支持,也可以提供目录文件的打包下载等.可以看https://git ...

  3. PHP与ECMAScript_7_流程控制

      PHP ECMAScript 顺序结构 默认从上到下依次执行 默认从上到下依次执行 分支结构 if  / switch if   /  switch 循环结构 for / while / do-w ...

  4. Java实现常见的排序算法

    一.排序算法 常见的排序算法主要分为下面几类: 选择排序 堆排序 冒泡排序 快速排序 插入排序 希尔排序 归并排序 桶式排序 基数排序 本文主要介绍选择排序.堆排序.冒泡排序.快速排序和归并排序的原理 ...

  5. 脱壳0-FSG壳-详细流程

    目录 @ 1 拿到当前加壳程序,用exeinfo/PeID 看一下信息 可以看出是很老的壳FSG. 分析: ​ Entry Point : 000000154,熟悉PE结构的知道,入口点(代码)揉进P ...

  6. 微信小程序onLoad与onShow的区别

    现在招聘网站上,会小程序开发都可以找到月薪不错的职位了,可见小程序认可度还是可以的! 小程序声明周期onLoad与onShow的区别? onLoad页面加载时调用,可以获取参数,通过options. ...

  7. 深入理解Java中的AQS

    AQS概述 ​ AbstractQueuedSynchronizer抽象队列同步器简称AQS,它是实现同步器的基础组件,juc下面Lock的实现以及一些并发工具类就是通过AQS来实现的,这里我们通过A ...

  8. H3C模拟器单臂路由配置实例

    单臂路由:用802.1Q和子接口实现VLAN间路由 单臂路由利用trunk链路允许多个VLAN的数据帧通过而实现 网络拓扑图: RTA配置: SW1配置: PC1/2配置如图: 但是值得注意的是,在配 ...

  9. C# Winform 自定义控件——TextBox

    效果:   描述: 类似html标签里input标签里的placeHolder属性,控件继承TextBox,拥有一个描述提示信息的字段_txtPlaceHolder,重写了消息处理函数WndProc, ...

  10. dubbo是如何控制并发数和限流的?

    ExecuteLimitFilter ExecuteLimitFilter ,在服务提供者,通过 的 "executes" 统一配置项开启: 表示每服务的每方法最大可并行执行请求数 ...