!!!这篇文章有错误,日后更新,推荐立即关闭该网页。

--2020/4/30

kmp算法包括两步

1,计算next数组,即对要寻找的字符串标记值,例如abcabc,这边有六个字符,从a开始,将每一个字符与这个字符串开头开始匹配,第一个字符标记为0,第二个字符为b,明显与字符串开头a不相等,因此标记为0。第四个字符为a,与字符串开头a相等,因此标记为1,第五个字符为b,但他前面的字符被标记为1,因此第五个字符要与第1+1个字符相比较,如果相似,则标记为前一个字符标记的值+1.

贴代码

void cal_next(int *next,char tstr[100],int tlen)//这边传递了next数组的地址,要标记的字符串以及用于遍历的字符串长度;
{next[0] = 0;//对第一个字符标记为0;for (int i = 1; i < tlen; i++)//遍历,先查看前一个字符的标记值,如果为0,则将字符与第一个字符相比较,如果不为0,假设为x,则与第x+1个字符比较;{if (next[i - 1] == 0){if (tstr[i] == tstr[0])next[i] = 1;elsenext[i] = 0;}else{if (tstr[i] == tstr[next[i - 1]])next[i] = next[i - 1] + 1;elsenext[i] = 0;}}
}

2.进行匹配,如果匹配到目标数组中间发现后面不匹配,就访问最后一个匹配字符的标记值,例如主串abcabbbbbb,目标串abcabc假设匹配到第二个b的时候后面不匹配了,根据之前的求next数组方法,可以得到目标串。第二个b的标记值为2,这个b在目标串位置为第5个,因此下次要移动5-2次,即移动三个单位,此时目标串的a刚好对上主串第二个a。

贴代码

int kmp(char sstr[], char tstr[], int next[], int slen, int tlen)
{int i = 0, j = 0;while (i < slen)//遍历主串{bool flag = true;//立个flag,循环一下如果倒了,说明不匹配。while (j < tlen)//遍历目标串{if (sstr[i] == tstr[j])//判断是否匹配{i++;j++;continue;}else{flag = false;break;}}if (flag == true)//看flag有不有倒。return i - j + 1;else{if (j == 0)//这个if语句之前没用,产生了bug,当j=0的时候,next[j-1]是next[-1],这时就会得到意外的值。i = i + 1;else{i = i + (j - next[j - 1]);j = 0;}}}return -1;//如果匹配失败,则返回-1;
}

-------------------------------------------切割-----------------下面是完整代码-----------------------------------------------------------

#include <iostream>
#include <string>
using namespace std;
void cal_next(int *next,char tstr[100],int tlen)
{next[0] = 0;for (int i = 1; i < tlen; i++){if (next[i - 1] == 0){if (tstr[i] == tstr[0])next[i] = 1;elsenext[i] = 0;}else{if (tstr[i] == tstr[next[i - 1]])next[i] = next[i - 1] + 1;elsenext[i] = 0;}}
}
int kmp(char sstr[], char tstr[], int next[], int slen, int tlen)
{int i = 0, j = 0;while (i < slen){bool flag = true;while (j < tlen){if (sstr[i] == tstr[j]){i++;j++;continue;}else{flag = false;break;}}if (flag == true)return i - j + 1;else{if (j == 0)i = i + 1;else{i = i + (j - next[j - 1]);j = 0;}}}return -1;
}
int main()
{char sstr[100], tstr[100], ch = 0;int slen, tlen;cout << "Please enter the sstr:" << endl;cin >> sstr;again:cout << "Please enter the ttstr:" << endl;cin >> tstr;slen = strlen(sstr);tlen = strlen(tstr);int next[100];cal_next(next, tstr, tlen);cout << "The next array is:";for (int i = 0; i < tlen; i++)cout << next[i];cout << endl;int situ;situ = kmp(sstr, tstr, next, slen, tlen);cout << "These two strings are matched in No." << situ << endl;goto again;system("pause");return 0;
}

KMP-看毛片算法 c++相关推荐

  1. KMP 看毛片算法原理及其实现

    kmp算法 前言: 如何匹配字符串??? 一. 暴力匹配字符串 1.1 暴力算法描述 1.2 暴力算法实现 二. KMP算法 匹配字符串 2.1 三个概念: 最长前缀; 最长后缀; 最长公共前后缀? ...

  2. 王道数据结构课代表 - 考研数据结构 第四章 串-KMP(看毛片算法) 究极精华总结笔记(C版本)

    本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对数据结构知识点的理解的总结.希望对新一届的计算机考研人提供帮助!!!   关于对 串 章节知识点总结的十分全面,涵括了<王道数据结构 ...

  3. KMP算法——俗称看毛片算法

    咳咳咳,这是看毛片算法的简单介绍 首推一个博客,这个博客很优秀,我的KMP算法就是从上面学来的--https://www.cnblogs.com/yjiyjige/p/3263858.html 算法思 ...

  4. 每日算法练习——模式匹配KMP算法(看毛片算法?)

    知识补充: 在计算机科学中,Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置.此算法通过运用对这个词在不匹配时本身就包含足够的信息来 ...

  5. [看毛片算法][KM]zoj 3615:Choir II

    大致题意:     有n个男生,m个女生,每个人用一句话描述其他的异性.对与第i个人和第j个异性,其好感值为其姓名第一次出现的位置和出现次数的乘积.现在要匹配这些人,使得总的好感值之和最大,求这个值. ...

  6. KMP 快速匹配字符串 算法 数据结构

    以下内容转载自 https://www.toutiao.com/i6854730621588242951/ 今天是算法数据结构专题的第29篇文章,我们来聊一个新的字符串匹配算法--KMP. KMP这个 ...

  7. 【ZOJ3587】Marlon's String——白四爷×KMP 白濑肆の算法完全解读KMP篇 KMP来袭第二弹前缀什么的果然最讨厌了!【1.0%达成!】

    #include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> ...

  8. 一个框架看懂优化算法之异同 SGD/AdaGrad/Adam

    Adam那么棒,为什么还对SGD念念不忘 (1) -- 一个框架看懂优化算法 机器学习界有一群炼丹师,他们每天的日常是: 拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着 ...

  9. 送书 | 你一定能看懂的算法基础书(代码示例基于Python)

    本文引自图灵教育<算法图解> 你一定能看懂的算法基础书:代码示例基于Python:400多个示意图,生动介绍算法执行过程:展示不同算法在性能方面的优缺点:教会你用常见算法解决每天面临的实际 ...

  10. 一张图看懂图像识别算法发展历史

    一张图看懂图像识别算法发展历史

最新文章

  1. c3p0数据库连接池的使用详解
  2. UVA 1515 - Pool construction(最小割)
  3. mysql 使用EF6.0CodeFirst
  4. login控件authenticate_Login.Authenticate 事件 (System.Web.UI.WebControls) | Microsoft Docs
  5. 计算机板报课作文500字,办板报作文500字
  6. html5 input required oninvalid,为什么我的“ oninvalid”属性会让模式失败?
  7. JAVA运算符和优先级
  8. 工欲善其事必先利其器(一)
  9. 蔚来资本宣布完成约4亿美元二期基金募集
  10. 面试总结之人工智能AI(Artificial Intelligence)/ 机器学习(Machine Learning)
  11. 的udp的接收端如何看速率_计算机网络 TCP与UDP
  12. postgresql9.5.9相关的日志文件介绍
  13. vue项目本地服务器调用豆瓣接口,vue调用豆瓣API加载图片403问题
  14. 毕业设计报告(附项目可行性分析)
  15. 高等数学张宇18讲 第三讲 一元函数微分学的概念与计算
  16. POJ 1201 Intervals(差分约束)
  17. 《GAMES203:三维重建和理解》1 三维视觉(3D Vision)介绍
  18. 计算机网络学习笔记(广域网)
  19. 关于gcc -m32 -o 编译错误: /usr/bin/ld: cannot find -lgcc
  20. 双屏(Daul Monitor)很爽

热门文章

  1. 三篇ICLR2022与时间图序列相关的研究工作
  2. 唯品会三年,被裁员,如今跳槽天猫拿下offer(Java岗)
  3. Word字体倾斜如何弄正
  4. c语言编程偏差及均方差,C语言写的方差调试成功却运行出错
  5. 万能计算机作文,万能作文(万能通用作文600字)
  6. netstat 介绍
  7. What is Fan-out
  8. 【精华】强烈推荐你使用去中心化以太坊钱包 - ETH最安全的钱包
  9. 本人写的手机狗(防盗软件)欢迎下载
  10. 如何向领导汇报工作(4)