#include <iostream>
#include<vector>
#include<string>
#include <unordered_map>
#include <unordered_set>
#include <queue>
#include <algorithm>//算法头文件
#include <numeric>
#include <stack>
#include<typeinfo>#include<stdio.h>
using namespace std;class KMP {
private:vector<vector<int>> dp;//二维状态转移数组string pat;//模式串
public:KMP(string _pat) {pat = _pat;int len = pat.size();//状态转移数组dp.resize(len, vector<int>(256));//指定大小后 默认值为0//边界条件 在0状态时只有遇到了pat[0]才能转到状态1dp[0][(int)pat[0]] = 1;//初始化影子状态初始值int X = 0;//构建状态转移图for (int j = 1; j < len; j++) {for (int c = 0; c < 256; c++) {if(c != (int)pat[j])dp[j][c] = dp[X][c];            //如果遇到的字符c与j状态需要进行推进所匹配的字符不匹配时 就状态重启到影子状态elsedp[j][c] = j + 1;    //如果遇到的字符c与j状态需要进行推进所匹配的字符相匹配时 将进行状态推进//也可以对上面的if进行优化如下面注释的两行//dp[j][c] = dp[X][c];            //如果遇到的字符c与j状态需要进行推进所匹配的字符不匹配时 就状态重启到影子状态//dp[j][(int)pat[j]] = j + 1;    //如果遇到的字符c与j状态需要进行推进所匹配的字符相匹配时 将进行状态推进}//更新影子状态X = dp[X][(int)pat[j]];}}int search(string txt) {int len = txt.size();//pat串的初始状态为0int j = 0;for (int i = 0; i < len; i++) {//计算j的下一个状态j = dp[j][(int)txt[i]];//如果状态到达终止态(到pat末尾时)if (j == pat.size()) return i - pat.size() + 1;}//如果遍历完txt还没到达终止态则匹配失败return -1;}
};int main()
{string pat = "aaab";//ababc  aaabstring txt = "aaaaaaab"; //aaaaaaab  aaacaaabKMP aa(pat);int pos1 = aa.search(txt);cout << pos1 << endl;system("pause");return 0;
}

C++ KMP算法完整实现相关推荐

  1. 【★】KMP算法完整教程

    2019独角兽企业重金招聘Python工程师标准>>> KMP算法完整教程 全称:                               Knuth_Morris_Pratt ...

  2. !KMP算法完整教程

      KMP算法完整教程 全称:                               Knuth_Morris_Pratt Algorithm(KMP算法) 类型:                ...

  3. KMP算法具体解释(转)

    作者:July. 出处:http://blog.csdn.net/v_JULY_v/. 引记 此前一天,一位MS的朋友邀我一起去与他讨论高速排序,红黑树,字典树,B树.后缀树,包含KMP算法,只有在解 ...

  4. 字符串:3.KMP算法(快速模式匹配算法)详解

    BF算法的改进--KMP算法(快速模式匹配算法). 串的普通模式匹配算法,大体思路是:模式串从主串的第一个字符开始匹配,每匹配失败,主串中记录匹配进度的指针 i 都要进行 i-j+1 的回退操作(这个 ...

  5. 【数据结构】详解KMP算法

    字符串匹配算法:简单来说就是给你一个主串和一个子串,让你查找子串在主串中的位置,找到返回下标. 常见的两种算法:BF算法.KMP算法 这两种算法是怎样的思路呢,我们接着往下看: 目录 BF算法(暴力算 ...

  6. 字符串匹配代码C语言,KMP算法(快速模式匹配算法)详解以及C语言实现

    通过上一节的介绍,学习了普通模式匹配算法,大体思路是:模式串从主串的第一个字符开始匹配,每匹配失败,主串中记录匹配进度的指针 i 都要进行 i-j+1 的回退操作(这个过程称为"指针回溯&q ...

  7. 【数据结构Note4】-串、数组和广义表(kmp算法详解)

    文章目录 串.数组和广义表 1. 串 1.1 串的概念和结构 1.2 顺序串和链串 1.3 BF算法--串的模式匹配法之一 1.5 KMP算法--串的模式匹配法之一 1.5.1 next数组 1.5. ...

  8. 详解KMP算法原理,以及完整java与C++实现

    点击此处学习更多算法与通信知识 作者 | labuladong 来源 | labuladong KMP 算法(Knuth-Morris-Pratt 算法)是一个著名的字符串匹配算法,效率很高,但是确实 ...

  9. C++KMP算法字符串匹配(附完整源码)

    C++KMP算法字符串匹配 C++KMP算法字符串匹配完整源码(定义,实现,main函数测试) C++KMP算法字符串匹配完整源码(定义,实现,main函数测试) #include <iostr ...

最新文章

  1. Druid数据库连接池超时问题com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 1000, active 10
  2. C#获取当前进程、项目路径的方法
  3. 12-openldap使用AD密码
  4. 『ACM-算法-二分法』算法竞赛进阶指南--在单调递增序列a中查找大于等于X的数中最小的一个,即X或X的后继
  5. 向ComboBox列表框中添加Enum的全部数据
  6. 【剑指offer】面试题38:字符串的排列(Java)
  7. mac chrome 跨域
  8. MYSQL无限级分类表设计及自我连接
  9. mysql 存储过程排序_MYSQL查询节点的所有父节点,按层级排序的存储过程
  10. java循环判断要点_Java 循环条件判断好题锦集
  11. java缓冲流和普通流的区别_关于java:数据输入/输出流和缓冲的输入/输出流有什么区别?...
  12. 利用EQSecure E盾预防流氓软体
  13. word流程图两条线的端点连接_word流程图连接线怎么用
  14. 某连锁酒店集团实行积分奖励计划,会员每次入住集团旗下酒店均可以获得一定积分,积分由欢迎积分加消费积分构成。其中欢迎积分跟酒店等级有关,具体标准如表2-1所示;消费积分跟每次入住消费金额有关,具体标准为
  15. 混频器 matlab,基于FPGA数字混频器的设计
  16. 基于JAVA的企业部门报销管理信息系统的设计与实现
  17. 【Charles基础】Charles抓取微信小程序乱码,抓取指定的请求
  18. Blink SQL内置函数大全
  19. 持续更新 BUUCTF——PWN(一)
  20. 2019智能手表推荐_2020年买什么智能手表合适?

热门文章

  1. solaris 10 安装oracle 10g
  2. Notification(二)——PendingIntent的flag导致数据同样的问题
  3. java算法 第七届 蓝桥杯B组(题+答案) 5.抽签
  4. Random类——获取随机数
  5. DSP、ARM和单片机的区别
  6. 遍历groupBox控件的每一个子控件的写法
  7. hdu 4983(欧拉函数)
  8. NYOJ 633 幂
  9. NYOJ 1085 数单词 (AC自动机模板题)
  10. MYSQL5.7.17设置初始密码