KMP算法核心:

  1. 当前字符如果不相等的话,那么字符串当前位前面最多有多少位可以和模式字符串的前多少位匹配,这些匹配的串不用再匹配了,往后移就可以了。

  2. next[1-j]表示[0,j-1]之间前缀和后缀相等的位数,next[0]=-1是为了编程方便。

  3. 求next时,使用p的前缀匹配p

步骤:getnext,getpos

#include<iostream>
using namespace std;
void get_next(char* t, int* next) {int i = 0;int j = -1;int le = strlen(t);next[0] = -1;while (i < le-1) {if (j == -1 || t[i] == t[j]) {i++;j++;next[i] = j;}else j = next[j];}
}
int get_pos(char* s, char* t, int* next) {int i = 0;int j = 0;//从字符串开始位置检索int s_len = strlen(s);int t_len = strlen(t);while (i < s_len && j < t_len) {if (j == -1 || s[i] == t[j]) {i++;j++;}else j = next[j];}if (j == t_len) return i -j;else return -1;
}int main() {int next[100]{};char s[]{ "1hhahhahha" };char t[]{ "hha" };get_next(t, next);cout << get_pos(s, t, next);return 0;
}

KMP的改进算法

#include<iostream>
using namespace std;
void get_next(char* t, int* next) {int i = 0;int j = -1;next[0] = -1;int le = strlen(t);while (i < le-1) {if (j == -1 || t[i] == t[j]) {i++;j++;if (t[i] != t[j])next[i] = j;else next[i] = next[j];//KMP算法的改进,如果第a位字符与他的b位字符相等,那么a位字符的next值就是b位的next值,如果不等,就是他自己的值。}else j = next[j];}
}
int get_pos(char* s, char* t, int* next) {int i = 0;int j = 0;//从字符串开始位置检索int s_len = strlen(s);int t_len = strlen(t);while (i < s_len && j < t_len) {if (j == -1 || s[i] == t[j]) {i++;j++;}else j = next[j];}if (j == t_len) return i -j;else return -1;
}int main() {int next[100]{};char s[]{ "hhahhahha" };char t[]{ "hha" };get_next(t, next);for (int i = 0; i < 10; i++) {cout << next[i];}cout << get_pos(s, t, next);return 0;
}

KMP算法及其改进算法相关推荐

  1. 盖师贝格-撒克斯通(GS)算法及其改进算法

    盖师贝格-撒克斯通(GS)算法及其改进算法 本文摘自李景镇<光学手册> 盖师贝格(R.W.Gerchberg)和撒克斯通(W.O.Saxton)首先提出了一种振幅相位恢复算法,即GS算 法 ...

  2. 决策树决策算法ID3算法、改进算法C4.5算法和CART算法代码实现

    决策树决策算法之ID3算法 ID3算法 在决策树各个节点上应用信息增益准则选择特征,每一次都选择是的信息增益最大的特征进行分裂,递归的构建决策树 具体计算可以参考 决策常用算法数学计算过程 ID3代码 ...

  3. kmeans算法及其改进算法K-means++,ISODATA和Kernel K-means

    首先需要明确的是上述四种算法都属于"硬聚类"算法,即数据集中每一个样本都是被100%确定得分到某一个类别中.与之相对的"软聚类"可以理解为每个样本是以一定的概率 ...

  4. 欧拉算法及其改进算法

    电磁场中微积分方程的仿真实验(欧拉算法) 一.Euler公式 以当前点的值为初值,当前点的导数为导数,计算下一个步长的点的值. 代码实现如下: from matplotlib import pyplo ...

  5. 基于差分进化算法(DE)改进的jDE2 处理约束优化问题

    约束优化问题是生活中常见的问题,传统的方法解决起来比较麻烦,这里提供了一种基于差分进化算法的改进算法jDE2,整体的处理效果不错! 这里迭代1000次平均值达到-0.99809,而第三测试函数的最好值 ...

  6. nsl0重构算法 matlab,基于SL0压缩感知信号重建的改进算法

    第 28 卷 第 6 期 2012 年 6 月 信 号 处 理 SIGNAL PROCESSING Vol. 28 No. 6 Jun. 2012 收稿日期: 2012-03-30; 修回日期: 20 ...

  7. 传统目标跟踪——CamShift算法(改进MeanShift)

    目录 一.CamShift 1.1 原理 二.流程 三.代码 四.总结 一.CamShift MeanShift的结果有一个问题,检测窗口的大小是固定的,而目标是一个由近到远逐渐变小的过程,固定的窗口 ...

  8. 浅谈算法(简单算法)

    前言 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出. ...

  9. 【算法】妙不可言---算法复杂性

    #14天阅读挑战赛# 14天阅读挑战赛 CSDN近期举办14天阅读打卡活动 目录 一.算法复杂性 ◼ 一棋盘粮有多少 ◼ 神奇的兔子数列 一.算法复杂性 如果我们想要求这样一个序列的每个元素之和: 你 ...

最新文章

  1. 单片机自学多久可以成功?学单片机需要什么基础知识?
  2. ios小项目——新浪微博客户端总结
  3. mybatis 分页需要的jar包下载_064、MyBatis
  4. Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(上)
  5. wireshark提取流量包中的文件_从Wireshark监听的数据中提取需要的数据
  6. ListView控件学习系列2-编辑ListView(Edit,Update,Insert,Delete)
  7. logback基本入门
  8. docker run命令详解
  9. 10.15 wget:命令行下载工具
  10. Spring mvc中自定义拦截器
  11. java分隔符的引号,使用分隔符拆分带引号的字符串
  12. 彩光和灰光模块_5G承载网主要光模块图谱
  13. leetcode771. 宝石与石头 py永远的神!
  14. @async 没有异步_javascript之异步函数
  15. channel(4)定时器
  16. 95-140-114-源码-transform-算子project
  17. gtest 学习之五 测试用例中定义类
  18. python对文件操作的相关函数_第六章、Python文件操作
  19. 分层结构的生活例子_AI的分层强化学习与人脑神经机制的联系
  20. sys.dm_db_wait_stats

热门文章

  1. 智慧水利:水库水文监测系统
  2. Typora结合PicGo+Gitee(码云)实现图床
  3. Unity 战争迷雾----个人学习
  4. 直通车如何快速涨质量分到10分【全平台erp、进销存软件】
  5. 基于bootstrap实现的在线商城前端整站源码,页面齐全
  6. CF卡连接组装电脑时显示文件夹损坏请问怎样才能修复
  7. win7 x64.esd
  8. 交流电压有效值怎么求
  9. Intel HEX介绍
  10. 解读《大数据产业发展规划(2016-2020年)》