KMP 算法的 JS 实现
2021/9/12 20:05:04
本文主要是介绍KMP 算法的 JS 实现,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
KMP (Knuth-Morris-Pratt) 字符串查找算法可在一个字符串 S 内查找一个词 P 的出现位置。 一个词在不匹配时本身就包含足够的信息来确定下一个匹配可能的开始位置,此算法利用这一特性以避免重新检查先前匹配的字符。
-
朴素字符串匹配算法(暴力)- s 串中查找子串 p
-
挨个字符遍历 s 中的字符,与 p[0] 相等时
- 循环遍历 p, 两者索引同时后移
- 最终 p 的索引是否等于 p 的长度
let i = x, j = 1;//i -> s[x], j => p while (i < s.length && j < p.length && s[i] === p[j]) { ++i; ++j; } if (j === p.length) reutrn x;// 在当前位置匹配
-
-
KMP 算法
-
定义了一个公共前缀的概念:当前字符之前的字符串中,相同前缀后缀长度为多少。
- 首先建立一个与模式串 p 等长的存储 p 各个位置公共前缀长度的数组 next
next[0] = 0
- 计算 next
let next = new Array(m);//next数组 next[0] = 0; for (let i = 1, j = 0; i < m; i++){ while (j && s[i] !== p[j]) {//不匹配,左移 j = next[j - 1]; } if (s[i] === p[j]) ++j;//匹配, j 右移 + 1 next[i] = j; }
- 首先建立一个与模式串 p 等长的存储 p 各个位置公共前缀长度的数组 next
-
通过 next 数组,在某个字符失配的时候,该字符对应的 next 值会告诉你下一步匹配中,模式串应该跳到哪个位置( next [j] )。如果 next [j] 等于 0,则跳到模式串的开头字符,若 next [j] > 0,代表下次匹配跳到 j 之前的某个字符,而不是跳到开头,且具体跳过了 next [j] 个字符。实现了
O(n + m)
的时间复杂度。 -
JS 实现
const kmp = (s1, s2) => { const n = s1.length;//模式串 const m = s2.length;//匹配串 if (!m) return 0;//匹配串为空 let next = new Array(m);//next数组 next[0] = 0; for (let i = 1, j = 0; i < m; i++){ while (j && s2[i] !== s2[j]) {//不匹配,左移 j = next[j - 1]; } if (s2[i] === s2[j]) ++j;//匹配 i j右移 next[i] = j; } //匹配 for (let i = 0, j = 0; i < n; i++){ while (j && s1[i] !== s2[j]) {// 失配 左移 j = next[j - 1]; } if (s1[i] === s2[j]) ++j;// 匹配 j + 1 if (j === m) return i - m + 1; } return - 1; }
这篇关于KMP 算法的 JS 实现的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-21Vue3教程:新手入门到实践应用
- 2024-12-21VueRouter4教程:从入门到实践
- 2024-12-20Vue3项目实战:从入门到上手
- 2024-12-20Vue3项目实战:新手入门教程
- 2024-12-20VueRouter4项目实战:新手入门教程
- 2024-12-20如何实现JDBC和jsp的关系?-icode9专业技术文章分享
- 2024-12-20Vue项目中实现TagsView标签栏导航的简单教程
- 2024-12-20Vue3入门教程:从零开始搭建你的第一个Vue3项目
- 2024-12-20从零开始学习vueRouter4:基础教程
- 2024-12-20Vuex4课程:新手入门到上手实战全攻略