1、什么是K.M.P算法

K.M.P算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。

总得来说,它是一种字符串匹配算法,相比于暴力破解,有了一定的改进。

首先我们先看下对于字符串匹配的暴力破解方式:

/*** 暴力破解方法* @param str* @param mstr* @return*/
public static int strMatch(String str, String mstr) {char[] s = str.toCharArray();char[] m = mstr.toCharArray();int i = 0; // 主串的位置int j = 0; // 匹配串的位置while (i < s.length && j < m.length) {if (s[i] == m[j]) { // 当两个字符相同,就比较下一个i++;j++;} else {i = i - j + 1; // 一旦不匹配,i后退,回退到字符串匹配循环开始位置后一位j = 0; // j归0}}// 判断是否有匹配串,返回第一个发现的匹配串位置if (j == m.length) {return i - j;} else {return -1;}
}

暴力破解的思路就是,匹配串从主串开始位置进行匹配,如果有一个字符串不匹配,则主串从开始匹配位置往后移动1位,匹配返回开始位置重新与主串进行比较,循环往复。

2、K.M.P算法相比于暴力破解改进了什么?

我们观察暴力破解算法,很明显会注意到,如果匹配串与主串不匹配了,那么主串指针会退到字符串匹配循环开始位置后一位,匹配串指针也是回溯到开始位置,并与主串指针所指向位置重新进行匹配,效率很低,但如果移动多位数据又会不准确,那么主串指针及匹配串指针要移动到什么位置是一个很重要的改进点,而K.M.P给了我们一个思路:

利用匹配失败后的信息,主串指针指向位置不变,改变模式串指针指向位置进行匹配,以尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息 。

观察匹配串中从前往后遍历,分解出的子串有没有与开始字符串相匹配,匹配了几位,用数据展示出来就形成了一个前缀表:

i   str          next[i]
0   A            0
1   AB           0
2   ABA          1
3   ABAB         2
4   ABABC        0
5   ABABCA       1
6   ABABCAB      2
7   ABABCABA     3
8   ABABCABAA    1

代码展示如下:

private int[] getNext(String pattern) {int[] next = new int[pattern.length()];char[] charP = pattern.toCharArray();int len = 0, k = 1;next[0] = 0;while(k < charP.length){if(charP[len] == charP[k]){len++;k++;next[k] = len;}else{if(len > 0){/** 如果不相等,说明这次多出来的这个字符并没有让共有字符串的长度加1,而且,可能还会直接影响到上一次的共有字符串长度这里的做法是:因为多出来一个字符,而且charArr[i] != charArr[len],那这次已经不能拿上一次共有字符串位置上的字符来做比较了,必须拿上上一次的结果*/len = next[len - 1]; }else{next[k] = len;k++;}}}for(int i = charP.length - 1; i > 0; i--) next[i] = next[i - 1];next[0] = -1;return next;
}

这样,当字符串不匹配时,匹配串可以根据前缀表移动固定的位置,而主串指针不动。代码展示如下:

public int strStr(String text, String pattern) {if(text == null || pattern == null) return -1;if(pattern.length() == 0) return 0;int[] next = getNext(pattern);char[] charT = text.toCharArray();char[] charP = pattern.toCharArray();int i = 0, j = 0;while (i < charT.length && j < charP.length){if(charT[i] != charP[j]){j = next[j];if(i == -1){i++;j++;}}else{i++;j++;}}if(j == charP.length) return i - j;return  -1;
}

K.M.P算法个人浅谈相关推荐

  1. 最短汉密尔顿回路算法c语言,【算法】浅谈最短哈密尔顿回路类问题的两种近似算法...

    // 标题是糊弄人的 1. 问题引入 给出一张图,求其最短哈密尔顿回路,也就是 "旅行商问题"(Traveling Saleman Problem,TSP) 假设有一个旅行商人要拜 ...

  2. 【数据结构与算法】浅谈队列的应用

    学习数据结构与算法的时候,我们学到的队列Queue与FIFO紧密相关,First Input First Output,先进先出. 队列是一种特殊的线性表,特点是两端一端进一端出,与日常生活中不含插队 ...

  3. java 算法_Java 浅谈数据结构和算法

    以前不管自己还是朋友在面试java工程师岗位的时候,都会被问到这样的问题: "介绍下java中的数据结构和算法". 很多朋友被问到的时候发现无从下口,甚至特别是一些初级java工程 ...

  4. 风控算法知识——浅谈信息熵与IV值应用介绍

    此前我们讨论了WOE值以及应用场景,而提到了WOE值,就不得不再提出IV值,IV值公式的形成来源于信息熵,公式形式是类似的,只是具体的计算不一样.传送门:<风控算法知识--WOE值的深度理解与应 ...

  5. 【数据结构与算法】浅谈稀疏矩阵

      数据结构中我们就已经了解过稀疏矩阵的概念.在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵.   仅有几个0元素不太算稀疏矩阵,很大的数据集中 ...

  6. 同花顺如何切换k线_K线之形态学:浅谈纸白银产品该如何去做好交易?

    K线之形态学:浅谈纸白银产品该如何去做好交易? 由于疫情期间,明显感觉到今年做投资理财的朋友多了,特别是银行的纸产品,我是分析外盘伦敦银伦敦金为主,自己也是只操作外盘产品.国内的不管是纸白银或者TD白 ...

  7. 浅谈K短路算法(KSP)之二(YEN .J算法求解)

    对于具有n个顶点和m条边且边的权值非负的简单图(无重边和环),K短路,是指的起点s到终点t的最短路径中第k个最小的.K短路分为有限制的K短路和无限制的K短路,有限制的K短路是指求得的路径中不含有回路( ...

  8. 浅谈K短路算法(KSP)之一(A*算法求解)

    对于具有n个顶点和m条边且边的权值非负的简单图(无重边和环),K短路,是指的起点s到终点t的最短路径中第k个最小的.K短路分为有限制的K短路和无限制的K短路,有限制的K短路是指求得的路径中不含有回路( ...

  9. 浅谈算法和数据结构: 五 优先级队列与堆排序

    原文:浅谈算法和数据结构: 五 优先级队列与堆排序 在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象.最简单的一个例子就是,在手机上玩游戏 ...

最新文章

  1. LeetCode 22. Generate Parentheses--Python 解法--广度优先、深度优先解法
  2. “掌上神策”上线,数据解读随时随地
  3. css背景上能添加文字,CSS3怎么为文字添加背景?
  4. 2021年互联网公司“死亡”名单!(附清单)
  5. 像Excel一样使用python进行数据分析(1)
  6. android 更改软键盘_如何在Android的Google键盘上更改声音和振动
  7. 一天中的最佳学习时间
  8. python语句块规范_Python基础语法——代码规范判断语句循环语句
  9. 电话号码被标记,快速取消教程
  10. WebRoot和Web-Info区别
  11. mysql 经纬度 索引_转:mysql根据经纬度查找排序
  12. python画出分子化学空间分布(UMAP)
  13. Creational patterns
  14. SQLite System.DllNotFoundException for SQLite.Interop.dll
  15. list to torch
  16. android的aod的功能,一加正式推出氢OS 11:基于安卓11打造 新增「年轮AOD」功能
  17. AutoCAD中ObjectARX C++常用的方法
  18. 设置css阴影和取消css阴影
  19. lemming games 1!! hdlbits
  20. 计算机学院职业规划大赛策划书,大学生职业生涯规划大赛策划书(策划书范文).doc...

热门文章

  1. FICO-固定资产报废处置流程ABAVN
  2. 「python自学建议贴」Python学习路线+视频教程完整版
  3. html5开发战棋游戏,个人耗时三月独立开发的无限流战棋游戏求龙友们给些建议。 ......
  4. 关于Java双大括号{{}}
  5. 天津城建大学计算机学院官网,天津城建大学计算机与信息工程学院研究生导师简介-杨振舰...
  6. 搭建AdGuard Home广告拦截DNS解析服务器
  7. Tomcat网站上的core和deployer的区别
  8. 怎么更换vscode背景图,放入自己喜欢的图片
  9. 如何理解Vue的渐进式?
  10. Python(10)--文件读写/模块制作与发布