字符匹配模式-KMP算法

j直接跳到了2的位置,因为在之前的都相同。

那么就需要求如果不等了之后,j需要回跳的位置next[j]

            

     

            

                

如果tk'与tj相等,则next [j+1]=k'+1

如果tk‘与tj不相等,则继续向前找,直到找到next[0]=-1为止

注意:t是从0下标开始

  1. 1 void getnext(string t)
  2. 2
  3. 3 {
  4. 4
  5. 5 int j=0,k=-1;
  6. 6
  7. 7 int len=t.size();
  8. 8
  9. 9 next[0]=-1;
  10. 10
  11. 11 wihle(j<len)
  12. 12
  13. 13 {
  14. 14
  15. 15 if(k==-1||t[j]==t[k])
  16. 16
  17. 17 next[++j]==++k;
  18. 18
  19. 19 else
  20. 20
  21. 21 k=next[k];
  22. 22
  23. 23 }
  24. 24
  25. 25 }

得到next数组之后就可以进行枚举了,当s[i]!=t[j]时,就让j=next[j]然后再次进行讨论。

KMP匹配:

  1. 1 int KMP(steing s,string t,int pos)
  2. 2
  3. 3 {
  4. 4
  5. 5 int i=pos,j=0
  6. 6
  7. 7 int lens=s.size();
  8. 8
  9. 9 int lent=t.size();
  10. 10
  11. 11 getnext(t);
  12. 12
  13. 13 while(i<lens&&j<lent)
  14. 14
  15. 15 {
  16. 16
  17. 17 if(j==-1||s[i]==t[j])
  18. 18
  19. 19 i++,j++;
  20. 20
  21. 21 else
  22. 22
  23. 23 j=next[j];
  24. 24
  25. 25 }
  26. 26
  27. 27 if(j>=lent)//匹配成功,则返回i-lent+1(即为t串出现的位置)
  28. 28
  29. 29 return i-lent+1;
  30. 30
  31. 31 else
  32. 32
  33. 33 return -1;
  34. 34
  35. 35 }

另外:

算法优化

当s[i]!=t[j]时,j=next[j]=k,如果t[j]=t[k],就没必要来比较,直接退回到next[k].

代码如下:

  1. 1 void getnext(string t)
  2. 2 {
  3. 3 int j=0,k=-1;
  4. 4 int len=t.size();
  5. 5 next[0]=-1;
  6. 6 wihle(j<len)
  7. 7 {
  8. 8 if(k==-1||t[j]==t[k])
  9. 9 {
  10. 10 j++,k++;
  11. 11 if(t[j]==t[k])
  12. 12 next[j]=next[k];//下一次要跳时就会直接从j跳到next[k];
  13. 13 else
  14. 14 next[j]=k;
  15. 15 }
  16. 16 else
  17. 17 k=next[k];
  18. 18 }
  19. 19 }

KMP算法-字符匹配的更多相关文章

  1. KMP算法——字符匹配

     暴力匹配: 假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢? 如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置, ...

  2. KMP算法,匹配字符串模板(返回下标)

    //KMP算法,匹配字符串模板 void getNext(int[] next, String t) { int n = next.length; for (int i = 1, j = 0; i & ...

  3. KMP算法 字符串匹配(看猫片)

    前言 此篇笔记根据自己的理解和练习心得来解释算法,只代表个人观点,如有不足请指出(我刚学QWQ) 浅谈字符串匹配 设想一个场景,假设你是一个净化网络语言环境的管理员,每天需要翻阅大量的文章和帖子来查找 ...

  4. KMP算法——字符串匹配

    正直找工作面试巅峰时期,有幸在学校可以听到July的讲座,在时长将近三个小时的演讲中,发现对于找工作来说,算法数据结构可以算是程序员道路的一个考量吧,毕竟中国学计算机的人太多了,只能使用这些方法来淘汰 ...

  5. KMP算法---字符串匹配

    算法细节详见点击打开链接和点击打开链接 #include <stdio.h> #include <stdlib.h> #define N 7 #define M 15 void ...

  6. HDU-2087 剪花布条 字符串问题 KMP算法 查匹配子串

    题目链接:https://cn.vjudge.net/problem/HDU-2087 题意 中文题咯 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条, ...

  7. 字符串匹配(KMP 算法 含代码)

    主要是针对字符串的匹配算法进行解说 有关字符串的基本知识 传统的串匹配法 模式匹配的一种改进算法KMP算法 网上一比較易懂的解说 小样例 1计算next 2计算nextval 代码 有关字符串的基本知 ...

  8. KMP算法-Java实现

    目的: 为了解决字符串模式匹配 历程: 朴素模式匹配:逐次进行比较 KMP算法:利用匹配失败得到的信息,来最大限度的移动模式串,以此来减少比较次数提高性能 概念: m:是目标串长度 n:是模式串长度 ...

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

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

随机推荐

  1. pycharm 操作excel

    一.安装openpyxl Python中,往excel写入数据通常使用openpyxl库.也可以使用pandas库.这里讲解如何通过openpyxl库操作excel.pip install openp ...

  2. mumu模拟器使用

    连接mumu模拟器 启动mumu模拟器 执行命令:adb connect 127.0.0.1:7555(windows系统推荐使用gitbash) 安装app Gitbash下执行:adb insta ...

  3. Java安全之 ClassLoader类加载器

    Java安全之 ClassLoader类加载器 0x00 前言 前面这里抛出一个问题,Java到底是什么类型的编程语言?是编译型?还是解释型?在这个问题是其实一直都都有疑惑,如果说是解释型语言的话,那 ...

  4. iMAC_使用相关

    MAC软件下载 https://www.macwk.com/ 这是网站是一个下载免费软件的网站,下载通过<天翼云盘>下载,这个天翼云盘下载的快 好用的软件推荐 腾讯柠檬(Tencent L ...

  5. 鸿蒙内核源码分析(任务切换篇) | 看汇编如何切换任务 | 百篇博客分析OpenHarmony源码 | v41.03

    百篇博客系列篇.本篇为: v41.xx 鸿蒙内核源码分析(任务切换篇) | 看汇编如何切换任务 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁 ...

  6. Ueditor Version 1.4.3.3 SSRF

    点以前挖的洞.Ueditor是支持获取远程图片,较为经典的进行限制url请求,但是可以通过DNS重绑定绕过其验证. 代码分析 一般请求的url如下,其中source为数组,值为图片地址: /edito ...

  7. Spatial Analyst Tools(Spatial Analyst 工具)

    Spatial Analyst Tools 1.区域分析 # Process: 以表格显示分区几何统计 arcpy.gp.ZonalGeometryAsTable_sa("", & ...

  8. 题解 [ZJOI2016]大森林

    题目传送门 Description 现在有 \(n\) 棵以 \(1\) 为根的树,每棵树有一个生长节点,有 \(m\) 次操作,每次操作是下面三种中的一个: 在 \(l\sim r\) 的这些树的生 ...

  9. uoj167 元旦老人与汉诺塔(记忆化搜索)

    QwQ太懒了,题目直接复制uoj的了 QwQ这个题可以说是十分玄学的一道题了 首先可以暴搜,就是\(dfs\)然后模拟每个过程是哪个柱子向哪个柱子移动 不多解释了,不过实现起来还是有一点点难度的 直接 ...

  10. 小白自制Linux开发板 番外篇 一 modprobe加载驱动问题(转载整理)

    使用modprobe加载驱动 转载地址:https://blog.csdn.net/qq_39101111/article/details/78773362 前面我们提到,modprobe并不需要指定 ...