KMP算法JS实现
2024-10-19 13:32:00
参考阮一峰的《字符串匹配的KMP算法》,用JS实现一版,备忘~
// 主串
let str1 = 'BBC ABCDAB ABCDABCDABDEDC';
// 模式串
let str2 = 'ABCDABD'; /**
* 算出《部分匹配表》Partial Match Table
* 参考文档:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
* @method
* @param {String} str 要计算的字符串
* @return {Array} 部分匹配表
*/
let getPMT = (str = '') => {
if(str.length === 0)return [];
let pmt = [0];
let k = 2;
while(k <= str.length){
let temp = str.substring(0, k);
let length = temp.length;
// 前缀
let prefix = temp.substring(0, length - 1).split('').map((item, index) => {
return temp.substring(0, index + 1);
});
// 后缀
let suffix = temp.substring(1).split('').map((item, index) => {
return temp.substring(index + 1);
});
let publicLength = 0;
// 比较前缀后缀得出最长公共字符长度
prefix.forEach(preitem => {
suffix.forEach(sufitem => {
if(preitem === sufitem){
publicLength = preitem.length > publicLength ? preitem.length : publicLength;
}
})
})
pmt.push(publicLength);
k++;
}
return pmt;
} let pmt = getPMT(str2);
let m = 0;
let n = 0; while(m < str1.length && n < str2.length){
if(str1[m] === str2[n]){ // 匹配时,继续比较下一个字符
n++;
m++;
}else if(n > 0){ // 当前不匹配时,如果前面已匹配字符数 > 0,模式串索引往前移动pmt[n - 1]位
n = pmt[n - 1];
}else{
m++;
}
}
if(n === str2.length){
console.log(`str1包含str2,索引位置为${m - str2.length}至${m - 1}`);
}else{
console.log('str1不包含str2');
}
2019-09-17 23:21:38
最新文章
- discuz模板语法
- C# 通过Selecnuim WebDriver操作非IE浏览器
- 淘宝分布式文件存储系统:TFS
- pyside 添加菜单栏,窗口状态栏,工具栏
- linux查看硬件以及系统信息
- IT行业的正式入门
- 关于 jquery select2 多个关键字 模糊查询的解决方法
- Linux 面试题总结
- (四)主控板改IP,升级app,boot,mac
- phonegap–app启动欢迎引导页localstorage
- ASP.NET后台注册JS的方法
- Oracle计算连续天数,计算连续时间,Oracle连续天数统计
- C++的类和对象
- script加defer=";defer"; 的意义
- UVA10487(二分)
- RabbitMQ-从基础到实战(3)— 消息的交换
- HBuilder常用快捷键
- 获取对固定列不重复的新DataTable
- python2.7练习小例子(一)
- ansj构造最短路径