KMP字符串匹配算法
admin
2024-04-12 07:52:33
0次

引言

KMP算法的思想在于,让每一次匹配都尽可能使用先前匹配产生的信息(部分匹配表)。

KMP算法的难点在于,部分匹配表的构造也在尽可能使用之前构造过程中的信息(动态规划?)。

暴力 Vs KMP

暴力:失配,字串向后1位,成功匹配字符数归0。

KMP:失配,字串向后n位,成功匹配数m位。n,m的计算即KMP算法的核心。

找规律

??          ??
abcdabcy     abcdabcya?          a?
abcdabcy     abcdabcyab?         ab?
abcdabcy      abcdabcyabc?        abc?
abcdabcy       abcdabcyabcd?       abcd?
abcdabcy        abcdabcyabcda       abcda?
abcdabcy        abcdabcyabcdab?     abcdab?
abcdabcy        abcdabcyabcdabc?    abcdabc?
abcdabcy        abcdabcyabcdabcy
abcdabcy

观察得知,移动的位数分别需要考察 a ab abc abcd abcda abcdab abcdabc的前缀和后缀是否一样。
same[index]可以理解为pattern[index]之前的前后缀匹配最大长度
为了使得move[index] = index - same[index],规定same[0] = -1

index01234567
pattern[index]abcdabcy
same[index]-10000123
move[index]11234444

部分匹配表(失配函数)

上一部分中最后的表格能极大的帮助我们完成字符串的匹配,它也就是所谓的部分匹配表。使用该表的时机即pattern[index]无法匹配,所以该表也称失配函数

(难点)部分匹配表的构造

以 aabaabaaa为例子,构造部分匹配表

index012345678
pattern[index]aabaabaaa
same[index]-101012345
move[index]111333333

类似动态规划问题,如果我们已知same[index-1] = k,那么pattern[0...(index-2)]的前后缀匹配最大长度已知,即pattern[0...k-1] == pattern[(index-k-1)...(index-2)]。
在求same[index]时我们需要考虑新的字符pattern[index - 1],也就增加了1个后缀需要考虑的字符。

  • 如果pattern[k] == pattern[index-1],那么pattern[0...k] == pattern[(index-k-1)...(index-1)],那么same[index] = same[index - 1] + 1
  • 如果pattern[k] != pattern[index-1],则需要回溯到更小的匹配长度,一定小于k。我们考虑same[k]的定义,即pattern[k]之前的前后缀最大匹配长度,是能回溯到的最好的匹配长度。
    • 故继续判断pattern[same[k]]和pattern[index - 1]的大小关系,无法得出结果则继续回溯。
    • 如果回溯到初始情况因为same[0] == -1,则same[index] = 0

java代码

public static int[] getSame(String modelString) {int[] same = new int[100];same[0] = -1;int i = 0;int j = same[i];while (i < modelString.length()) {if (j == -1 || modelString.charAt(i) == modelString.charAt(j)) {// same[i+1] = same[i] + 1i++;j++;same[i] = j;} else {// backtrackj = same[j];}}return same;
}

最后

same可能就是其他文章中提到的next数组

参考

KMP字符串匹配算法【双语字幕】

wiki百科

相关内容

热门资讯

AI做攻略、“双向奔赴”……国... 本文转自:人民网人民网记者 许维娜今年国庆假期,AI(人工智能)成了不少年轻人的“旅行搭子”。行前做...
合肥的这个“梗”, 翻篇了 社交平台的评论区,曾长期流传一句专属于合肥的黑色幽默。有人问合肥哪里好玩,本地网友半开玩笑地回复:合...
7万+旅游中高层都在的群,今天... 做旅游这行,资源卡位、渠道互通、项目落地——往往就差一个“对的机会”。我们的行业社群已聚集70,00...
一场帐篷音乐节,如何让井研从“... 帐篷音乐节现场封面新闻记者 周洪攀10月的研溪湿地,晚风里裹着柑橘的清甜与民谣的回响。夜幕降临,10...
白鹤翩翩落星愿,上海迪士尼度假... 10月9日,世界候鸟日前夕,上海迪士尼度假区星愿公园的湖风里多了一分白鹤的灵动。三座白鹤雕塑正式揭幕...
成都锦江边赏初秋枫叶飘飘 目前,成都锦江边国华街枫叶树红了。近年来,国华街附近的几条街都栽种了红枫树,是城区较集中看枫叶的点位...
GBTA:商务旅行正在复苏,但... 亚太正在成为全球商务旅行增长的重要引擎。在经历疫情后的快速反弹之后,全球商务旅行正在进入一个新的增长...
从景区焕新到节赛引流 邹城双节... 齐鲁网·闪电新闻10月9日讯 中秋、国庆“双节”假期,邹城市文化和旅游局提前谋划、周密部署,立足自身...
江山如此多娇 且看石楼今朝 金秋十月,黄河岸畔秋意盎然,丰收盛会喜迎国庆。本次石楼国庆文旅活动以“江山如此多娇,且看石楼今朝”为...
海南国庆假期接待游客475.4... 2026年国庆假期,海南接待游客475.40万人次,较2025年增长13.1%,较2024年增长15...