C++ KMP算法完整实现
#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算法完整实现相关推荐
- 【★】KMP算法完整教程
2019独角兽企业重金招聘Python工程师标准>>> KMP算法完整教程 全称: Knuth_Morris_Pratt ...
- !KMP算法完整教程
KMP算法完整教程 全称: Knuth_Morris_Pratt Algorithm(KMP算法) 类型: ...
- KMP算法具体解释(转)
作者:July. 出处:http://blog.csdn.net/v_JULY_v/. 引记 此前一天,一位MS的朋友邀我一起去与他讨论高速排序,红黑树,字典树,B树.后缀树,包含KMP算法,只有在解 ...
- 字符串:3.KMP算法(快速模式匹配算法)详解
BF算法的改进--KMP算法(快速模式匹配算法). 串的普通模式匹配算法,大体思路是:模式串从主串的第一个字符开始匹配,每匹配失败,主串中记录匹配进度的指针 i 都要进行 i-j+1 的回退操作(这个 ...
- 【数据结构】详解KMP算法
字符串匹配算法:简单来说就是给你一个主串和一个子串,让你查找子串在主串中的位置,找到返回下标. 常见的两种算法:BF算法.KMP算法 这两种算法是怎样的思路呢,我们接着往下看: 目录 BF算法(暴力算 ...
- 字符串匹配代码C语言,KMP算法(快速模式匹配算法)详解以及C语言实现
通过上一节的介绍,学习了普通模式匹配算法,大体思路是:模式串从主串的第一个字符开始匹配,每匹配失败,主串中记录匹配进度的指针 i 都要进行 i-j+1 的回退操作(这个过程称为"指针回溯&q ...
- 【数据结构Note4】-串、数组和广义表(kmp算法详解)
文章目录 串.数组和广义表 1. 串 1.1 串的概念和结构 1.2 顺序串和链串 1.3 BF算法--串的模式匹配法之一 1.5 KMP算法--串的模式匹配法之一 1.5.1 next数组 1.5. ...
- 详解KMP算法原理,以及完整java与C++实现
点击此处学习更多算法与通信知识 作者 | labuladong 来源 | labuladong KMP 算法(Knuth-Morris-Pratt 算法)是一个著名的字符串匹配算法,效率很高,但是确实 ...
- C++KMP算法字符串匹配(附完整源码)
C++KMP算法字符串匹配 C++KMP算法字符串匹配完整源码(定义,实现,main函数测试) C++KMP算法字符串匹配完整源码(定义,实现,main函数测试) #include <iostr ...
最新文章
- Druid数据库连接池超时问题com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 1000, active 10
- C#获取当前进程、项目路径的方法
- 12-openldap使用AD密码
- 『ACM-算法-二分法』算法竞赛进阶指南--在单调递增序列a中查找大于等于X的数中最小的一个,即X或X的后继
- 向ComboBox列表框中添加Enum的全部数据
- 【剑指offer】面试题38:字符串的排列(Java)
- mac chrome 跨域
- MYSQL无限级分类表设计及自我连接
- mysql 存储过程排序_MYSQL查询节点的所有父节点,按层级排序的存储过程
- java循环判断要点_Java 循环条件判断好题锦集
- java缓冲流和普通流的区别_关于java:数据输入/输出流和缓冲的输入/输出流有什么区别?...
- 利用EQSecure E盾预防流氓软体
- word流程图两条线的端点连接_word流程图连接线怎么用
- 某连锁酒店集团实行积分奖励计划,会员每次入住集团旗下酒店均可以获得一定积分,积分由欢迎积分加消费积分构成。其中欢迎积分跟酒店等级有关,具体标准如表2-1所示;消费积分跟每次入住消费金额有关,具体标准为
- 混频器 matlab,基于FPGA数字混频器的设计
- 基于JAVA的企业部门报销管理信息系统的设计与实现
- 【Charles基础】Charles抓取微信小程序乱码,抓取指定的请求
- Blink SQL内置函数大全
- 持续更新 BUUCTF——PWN(一)
- 2019智能手表推荐_2020年买什么智能手表合适?