知识补充:

在计算机科学中,Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置。此算法通过运用对这个词在不匹配时本身就包含足够的信息来确定下一个匹配将在哪里开始的发现,从而避免重新检查先前匹配的字符。

from wiki :https://zh.wikipedia.org/wiki/%E5%85%8B%E5%8A%AA%E6%96%AF-%E8%8E%AB%E9%87%8C%E6%96%AF-%E6%99%AE%E6%8B%89%E7%89%B9%E7%AE%97%E6%B3%95

代码实现C++

#include <stdio.h>
#include <stdlib.h>
#include <string.h>void cal_next(char *str, int *next, int len)
{next[0] = -1;//next[0]初始化为-1,-1表示不存在相同的最大前缀和最大后缀int k = -1;//k初始化为-1for (int q = 1; q <= len-1; q++){while (k > -1 && str[k + 1] != str[q])//如果下一个不同,那么k就变成next[k],注意next[k]是小于k的,无论k取任何值。{k = next[k];//往前回溯}if (str[k + 1] == str[q])//如果相同,k++{k = k + 1;}next[q] = k;//这个是把算的k的值(就是相同的最大前缀和最大后缀长)赋给next[q]}
}int KMP(char *str, int slen, char *ptr, int plen)
{int *next = new int[plen];cal_next(ptr, next, plen);//计算next数组int k = -1;for (int i = 0; i < slen; i++){while (k >-1&& ptr[k + 1] != str[i])//ptr和str不匹配,且k>-1(表示ptr和str有部分匹配)k = next[k];//往前回溯if (ptr[k + 1] == str[i])k = k + 1;if (k == plen-1)//说明k移动到ptr的最末端{//cout << "在位置" << i-plen+1<< endl;//k = -1;//重新初始化,寻找下一个//i = i - plen + 1;//i定位到该位置,外层for循环i++可以继续找下一个(这里默认存在两个匹配字符串可以部分重叠),感谢评论中同学指出错误。return i-plen+1;//返回相应的位置}}return -1;
}int main()
{char str[255];char ptr[255];int sl,pl;  //str 和 ptr 的长度printf("请输入主串s和子串t,用空格分隔:\n");scanf("%s %s",str,ptr)sl=strlen(str);pl=strlen(ptr);printf("主串长度:%d 模式子串长度:%d\n",sl,pl);int pos = KMP(str, sl, ptr, pl);printf("子串在主串中的位置:%d\n",pos);return 0;
}

第二版修改

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
// 修改成功void get_next( char *T, int *next,int Tlen)
{int j = -1;int i;next[0] = -1;for(i=1 ; i<Tlen ; i++){while(j>-1 && T[j+1]!=T[i]){j = next[j]; //回溯j}if(T[j+1] == T[i]){j++;}next[i] = j;}// 因为前缀是固定的,后缀是相对的。
}// 测试get_next()函数的功能
// void main()
// {//  char str[255] = "ababaaaba";
//  int next[255];
//  int i = 1;
//  str[0] = 1;
//  get_next(str, next);//  for( i=1; i<10;i++  )
//  {//      printf("%d\n",next[i] );
//  }
//  return 0;
// }// 返回子串T在主串S中的位置,若不存在则返回-1
int KMP(char *S, int Slen, char *T, int Tlen)
{int i = -1;int j = -1;int next[255];get_next(T, next, Tlen);while(i<=Slen && j<=Tlen){if( -1 == j || S[i] == T[j] ){i++;j++;}else{j = next[j];    // 回溯 j}}if( j >= Tlen ){return i-Tlen+1;    // 成功匹配返回位置}else{return -1;  //匹配失败,返回0}}int main(int argc, char const *argv[])
{char s[255],t[255];int pos;int slen, tlen;printf("请输入主串s和子串t,用空格分隔:\n");scanf("%s %s",s,t);slen = strlen(s);tlen = strlen(t);pos = KMP( s ,slen, t, tlen);printf("子串t在主串s中的位置为:%d\n",pos);return 0;
}

每日算法练习——模式匹配KMP算法(看毛片算法?)相关推荐

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

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

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

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

  3. 一文看懂KMP(看毛片)算法

    一文看懂KMP算法 KMP是一种模式匹配算法.常用于在一个较长的字符串中查找一个较短的字符串.通常称较长的字符串为主串,较短的待匹配的字符串为模式串. 比如给定一个主串S = ababacd,一个模式 ...

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

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

  5. kmp(看毛片)算法

    别人的两篇博客. 传送门1 传送门2 摘录: 其中T为主串,P为模式串. 其实就是在T中找P. 其中next数组存的是"部分匹配值". "部分匹配值"就是&qu ...

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

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

  7. KMP算法字符串模式匹配

    KMP字符串模式匹配详解 来自CSDN     A_B_C_ABC 网友 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算 ...

  8. BF、KMP、BM、Sunday算法讲解

    原文地址: https://www.cnblogs.com/Syhawk/p/4077295.html BF.KMP.BM.Sunday算法讲解 字串的定位操作通常称作串的模式匹配,是各种串处理系统中 ...

  9. 【每日算法】C语言8大经典排序算法(2)

    接上文--->[每日算法]C语言8大经典排序算法(1) 二.插入类排序 插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中 ...

最新文章

  1. 『假如我是面试官』RabbitMQ我会这样问!
  2. 【深度学习入门到精通系列】图片OCR讲解
  3. EF架构~单表一对多集合的插入(树型结构)
  4. 【数据结构与算法】之深入解析“冗余连接”的求解思路与算法示例
  5. CM: 使用ICF node实现对附件的读取
  6. Leetcode--304. 二维区域和检索
  7. mybatis中批量插入的两种方式(高效插入)
  8. mysql数据库操作类
  9. linux之git入门命令
  10. python汉字转到ascii码_python中ASCII码字符与int之间的转换方法
  11. 现金支票打印模板excel_施工表格填写不规范?500套最全施工资料表格模板,可直接套用|面层|分项...
  12. Android 十年之路: 主屏与导航
  13. linux下namp简单使用
  14. 现代信号处理 张贤达_清华大学信号处理著名学者张贤达去世,享年74岁
  15. Pull request 团队合作开发使用详解
  16. php中execute的用法,写操作execute
  17. 逆水寒服务器什么时候能维护好,逆水寒更新了什么内容 8月23日官方维护内容及时间一览...
  18. oracle安装后,电脑变得很卡,解决办法(安装的是oracle11g)
  19. vue3.2中ref高效的秘密:依赖收集错级位运算操作(bit/dep.w/dep.n)
  20. 医保卡和社保卡的区别

热门文章

  1. 今天看到一个web2.0下的思考性文章,非常有价值!
  2. Skype for Business后端服务器部署AlwaysOn可用性组实战篇
  3. AXURE表白原型(拼图+心形照片墙+表白信)
  4. VMware超级详解安装
  5. ubuntu拨号连接网络
  6. lol幸运召唤师链接_设计师如何为电子游戏带来好运
  7. 易语言.开源(绝地求生多功能盒子)类似LOL盒子
  8. cocos2dx 仿洛克人(毕业设计)
  9. matlab怎么恢复默认字体,如何重置Windows字体设置并恢复默认字体 | MOS86
  10. LeetCode 289 Game of Life(生命游戏)(Array)