参考阮一峰的《字符串匹配的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

最新文章

  1. discuz模板语法
  2. C# 通过Selecnuim WebDriver操作非IE浏览器
  3. 淘宝分布式文件存储系统:TFS
  4. pyside 添加菜单栏,窗口状态栏,工具栏
  5. linux查看硬件以及系统信息
  6. IT行业的正式入门
  7. 关于 jquery select2 多个关键字 模糊查询的解决方法
  8. Linux 面试题总结
  9. (四)主控板改IP,升级app,boot,mac
  10. phonegap–app启动欢迎引导页localstorage
  11. ASP.NET后台注册JS的方法
  12. Oracle计算连续天数,计算连续时间,Oracle连续天数统计
  13. C++的类和对象
  14. script加defer=&quot;defer&quot; 的意义
  15. UVA10487(二分)
  16. RabbitMQ-从基础到实战(3)— 消息的交换
  17. HBuilder常用快捷键
  18. 获取对固定列不重复的新DataTable
  19. python2.7练习小例子(一)
  20. ansj构造最短路径

热门文章

  1. 互联网UV,PU,TopN统计
  2. Ubuntu 14.04.2配置rsync
  3. c++中关联容器map的使用
  4. django--远程mysql
  5. SQL SERVER错误:已超过了锁请求超时时段。
  6. Java web开发——文件夹的上传和下载
  7. java 值传递、引用传递
  8. 【cf contest 1119 G】Get Ready for the Battle
  9. eclipse为项目设置jdk
  10. [RoarCTF 2019]Online Proxy