KMP算法:最长字符串匹配算法
KMP算法:最长字符串匹配算法
查找模式串在目标串中的位置
例如:目标串"asdasdaabbccaabsesdf" 模式串:“aabbccaabse” 则返回6,表示从索引下标是6开始匹配。(假设模式串索引为6‘a’的前缀:(a、aa、aab、aabb、aabbc、aabbcc、ab、abb、…)
后缀也是一样,只不过是以索引6‘a’为分割的后面字符串所有字串类型。(a、aa、aab、aabs、aabse、ab、abs、abse、…))
先讲解下思路:总体官方的话来说每次匹配失败时模式串则回退到n,关键核心思想是n是公共前缀和后缀的匹配个数,定义这个n的算法比较抽象。
模式串从左向右开始移动遍历:如果遍历到前面有相同的公共字串且当前字符和匹配到的字串下一位也相同则n+1,否则回到上一次匹配的地方,这个地方概念比较抽象,还是上图和代码。
示例演示:
设next数组用户保存当前字符公共前缀长度,模式串为pattern。设当前最大匹配前缀为j,向前遍历的索引为i。
设第一位的最大匹配为next[0] = -1,标志从头开始。I = 0,j = -1;最长前缀匹配为next[j] = j + 1;所以next[0] = 0;
I = 1,j = 0;Pattern[i] = a;Pattern[j] = a;最长前缀匹配为next[j] = j + 1;所以next[1] = 1;
I = 2,j = 1;Pattern[i] = b;Pattern[j] = a;因为:Pattern[i] != Pattern[j]; ①J = next[j] = 1; 回到①递归匹配
以上方法一次类推得到next数组。得next = {-1, 0, 1, 0, 0, 0, 1};
求得next数组后就好求了。
代码片段如下:
public static int[] next(String pattern){char[] chars = pattern.toCharArray();int i = 0;//当前移动指针,-1可以判断开始点int j = -1;//当前前缀和后缀匹配度int length = pattern.length();int[] next = new int[length];next[0] = -1;while (i < length - 1) {if (j == -1 || chars[i] == chars[j]) {i++;j++;next[i] = j;}else {j = next[j];}}return next;
}
设目标字符串为:
模式字符串为上述字符串:
一个一个比较:设i为目标串索引,j为模式串索引。I = 0,j = 0;A = a,I = 1,j = 1;Q != a,则模式串回退到next[1];I = 2,j = 0;判断next[j] == -1表示从头开始。则 i = 2,j = 0;A = a;i = 3,j = 1;
A = a;I = 4,j = 2;B = b;I = 5,j = 3;B = b;I = 6,j = 4;C = c;I = 7,j = 5;S!=a;则j = next[5] = 0;…以此类推,求完整个字符串,如果匹配成功则返回。
代码片段如下:
public static int kmp(String msg,String pattern){char[] msgs = msg.toCharArray();char[] patterns = pattern.toCharArray();int[] a = next(pattern);int i = 0, j = 0;while (i < msgs.length && j < patterns.length) {if (a[j] == -1 || msgs[i] == patterns[j]) {i++;j++;} else {j = a[j];}}if (j == patterns.length) {return i - j;}return -1;
}
KMP算法:最长字符串匹配算法相关推荐
- 算法之「字符串匹配算法」
前言 一说到两个字符串匹配,我们很自然就会想到用两层循环来匹配,用这种方式就可以实现一个字符串是否包含另一个字符串了,这种算法我们称为 BF算法. BF算法 BF算法,即暴力(Brute Force) ...
- 数据结构:KMP算法 串的模式匹配算法(全网最详细)
目录 KMP模式匹配算法 简述 KMP模式匹配算法原理 如果人眼来优化的话,怎样处理 接下来我们自己来发现j的移动规律: 这一段公式证明了我们为什么可以直接将j移动到k而无须再比较前面 ...
- BF,KMP,BM三种字符串匹配算法性能比较
三种最基本的字符串匹配算法是BF,KMP以及BM,BF算法是最简单直接的匹配算法,就是逐个比较,一旦匹配不上,就往后移动一位,继续比较,所以比较次数很都. 关于KMP和BM的详细介绍可以参考下面的两个 ...
- diff算法阮一峰_【重学数据结构与算法(JS)】字符串匹配算法(三)——BM算法
前言 文章的一开头,还是要强调下字符串匹配的思路 将模式串和主串进行比较 从前往后比较 从后往前比较 2. 匹配时,比较主串和模式串的下一个位置 3. 失配时, 在模式串中寻找一个合适的位置 如果找到 ...
- 大量的数据做字符串匹配_【重学数据结构与算法(JS)】字符串匹配算法(三)——BM算法...
前言 文章的一开头,还是要强调下字符串匹配的思路 将模式串和主串进行比较 从前往后比较 从后往前比较 2. 匹配时,比较主串和模式串的下一个位置 3. 失配时, 在模式串中寻找一个合适的位置 如果找到 ...
- python KMP算法查找子字符串
最近在刷leecode,碰见字符串检索题.原题是这样的,有两个字符串,一长一短,就看看短的是不是在长的里面,如果在返回第一个字符的下标. 因为总忘记,所以记录下我的思路是咋捋顺的,其实看这一篇就够了, ...
- C++实现KMP(Knuth-Morris-Pratt)字符串匹配算法
#include"iostream"using namespace std;// 暴力匹配算法 bool string_match(char *mains,unsigned int ...
- zzulioj 1818: squee_spoon and his Cube VI (KMP求最长字符串) 好题
1818: squee_spoon and his Cube VI Time Limit: 1 Sec Memory Limit: 128 MB Submit: 54 Solved: 13 S ...
- HDU 3613 Best Reward 扩展kmp算法(将一个字符串分成两个回文串)
题目链接:https://vjudge.net/problem/HDU-3613 After an uphill battle, General Li won a great victory. Now ...
最新文章
- 869所高校上榜!2020中国内地大学第三方综合指数排名出炉
- php接口 汉字出错 空,php接口开发时,数据解析失败问题,字符转义,编码问题(示例代码)...
- 零基础可以学python吗-初学者必知:零基础学习Python真的能学会吗?
- Maven如何用Eclipse创建一个Maven项目【笔记自用】
- python3 : remove,pop和del方法的区别
- boost::locale::utf8_codecvt用法的测试程序
- [算法系列之二十六]字符串匹配之KMP算法
- python下划线怎么输入_python长的下划线怎么打
- php获取错误信息函数,关于php:如何获取mail()函数的错误消息?
- ARC和MRC 兼容的单例模式
- shell 脚本的使用
- php5实现web services
- python多进程协同_简单谈谈python中的多进程
- 供应链金融业务信息化平台搭建要点分享
- java tiff 压缩,使用Java ImageIO进行Tiff压缩
- 计算机网络(考研)第二章 物理层
- 码农与程序员,就好比哈士奇与狼
- 他们做的通用人工智能,要让所有产品都具备“智能”大脑
- php批量改名工具,批量更名大师下载_批量改名大师(Win-Tool之文件批量更名工具) 1.8.7 演示版_极速下载站_软件下载...
- 星巴克2022新年限定特饮;丹麦蓝罐曲奇虎年春节礼盒;尊尼获加、督威啤酒等虎年限定 | 食品饮料新品...
热门文章
- 魅蓝3S发布 699元配指纹金属机身
- matlab仿真点目标,sar合成孔径雷达图像点目标仿真报告(附matlab代码).docx
- 编写测试用例方法之正交表分析法
- SQL 查询处理步骤
- python自带的集成开发环境是什么-【整理】各种Python的IDE(集成开发环境)的总结和对比...
- 新手必备pr 2021快速入门教程「八」关键帧的认识及使用
- 从两个角度求解线性回归模型参数
- CF896C Willem, Chtholly and Seniorious【珂朵莉树】
- Python迭代器itertools
- python获取两个日期间的工作日