zitcher
Version:
字符串匹配算法相关js实现
72 lines (69 loc) • 1.58 kB
JavaScript
/**
* kmp算法的js实现
* 使用方式:
* var finder = new kmp(partten)
* finder.findAll(target)
* finder.findFirst(target)
* @param {string} str 模式串
*/
function kmp(str) {
var len = str.length
var next = new Array(len)
next[0] = -1
var j = -1
for (var i = 1; i < len; i++) {
while (j > -1 && str.charAt(j + 1) != str.charAt(i)) {
j = next[j]
}
if (str.charAt(j + 1) == str.charAt(i)) {
j++
}
next[i] = j
}
this.next = next
this.keyword = str
}
/**
* 查找目标串中第一个出现的模式串
* @param {string} target 目标串
*/
kmp.prototype.findFirst = function (target) {
var j = -1
var targetLen = target.length
var keyLen = this.keyword.length
for (var i = 0; i < targetLen; i++) {
while (j > -1 && this.keyword.charAt(j + 1) != target.charAt(i)) {
j = this.next[j]
}
if (this.keyword.charAt(j + 1) == target.charAt(i)) {
j++
}
if (j == keyLen - 1)
return i - keyLen + 1
}
return -1
}
/**
* 查找目标串中所有模式串
* @param {string} target 目标串
*/
kmp.prototype.findAll = function (target) {
var result = []
var j = -1
var targetLen = target.length
var keyLen = this.keyword.length
for (var i = 1; i < targetLen; i++) {
while (j > -1 && this.keyword.charAt(j + 1) != target.charAt(i)) {
j = this.next[j]
}
if (this.keyword.charAt(j + 1) == target.charAt(i)) {
j++
}
if (j == keyLen - 1) {
result.push(i - keyLen + 1)
j = -1
}
}
return result
}
module.exports = kmp