基于KMP算法JavaScript的实现方法分析


Posted in Javascript onMay 03, 2013

算法的核心是部分匹配表和回退算法,部分匹配表的实现如下:

function kmpGetStrPartMatchValue(str) {
    var prefix = [];
    var suffix = [];
    var partMatch = [];
    for(var i=0,j=str.length;i<j;i++){
        var newStr = str.substring(0,i+1);
        if(newStr.length == 1){
            partMatch[i] = 0;
        } else {
            for(var k=0;k<i;k++){
                prefix[k] = newStr.slice(0,k+1);
                suffix[k] = newStr.slice(-k-1);
                if(prefix[k] == suffix[k]){
                    partMatch[i] = prefix[k].length;
                }
            }
            if(!partMatch[i]){
                partMatch[i] = 0;
            }
        }
    }
    prefix.length = 0;
    suffix.length = 0;
    return partMatch;
}
//demo
var t="ABCDABD";
console.log(kmpGetStrPartMatchValue(t));
//output:[0,0,0,0,1,2,0]

回退算法实现如下:
function KMP(sourceStr,targetStr){
    var partMatchValue = kmpGetStrPartMatchValue(targetStr);
    var result = false;
    for(var i=0,j=sourceStr.length;i<j;i++){
        for(var m=0,n=targetStr.length;m<n;m++){
            if(str.charAt(m) == sourceStr.charAt(i)){
                if(m == targetStr.length-1){
                    result = true;
                    break;
                } else {
                    i++;
                }
            } else {
                if(m>0 && partMatchValue[m-1] > 0){
                    m = partMatchValue[m-1]-1;
                } else {
                    break;
                }
            }
        }
        if(result){
            break;
        }
    }
    return result;
}
var s = "BBC ABCDAB ABCDABCDABDE";
var t = "ABCDABD";
console.log(KMP(s,t));
//output: true
Javascript 相关文章推荐
JavaScript 常见对象类创建代码与优缺点分析
Dec 07 Javascript
jquery实现的可隐藏重现的靠边悬浮层实例代码
May 27 Javascript
jquery easyui滚动条部分设置介绍
Sep 12 Javascript
简介JavaScript中用于处理正切的Math.tan()方法
Jun 15 Javascript
全面解析Bootstrap弹窗的实现方法
Dec 01 Javascript
喜大普奔!jQuery发布 3.0 最终版
Jun 12 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
Aug 31 Javascript
JavaScript中立即执行函数实例详解
Nov 04 Javascript
JavaScript引用类型Date常见用法实例分析
Aug 08 Javascript
Node批量爬取头条视频并保存方法
Sep 20 Javascript
js中int和string数据类型互相转化实例
Jan 16 Javascript
详解将微信小程序接口Promise化并使用async函数
Aug 05 Javascript
JS动态获取当前时间,并写到特定的区域
May 03 #Javascript
JS实现商品倒计时实现代码
May 03 #Javascript
Javascript代码在页面加载时的执行顺序介绍
May 03 #Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
May 03 #Javascript
javascript两种function的定义介绍及区别说明
May 02 #Javascript
阻止子元素继承父元素事件具体思路及实现
May 02 #Javascript
jquery 触发a链接点击事件解决方案
May 02 #Javascript
You might like
php mysql Errcode: 28 终极解决方法
2009/07/01 PHP
PHP常用数组函数介绍
2014/07/28 PHP
浅谈php数组array_change_key_case() 函数和array_chunk()函数
2016/10/22 PHP
PHP会话控制实例分析
2016/12/24 PHP
php微信公众号开发之二级菜单
2018/10/20 PHP
PHP代码加密的方法总结
2020/03/13 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
2020/04/06 PHP
PHP二维数组分页2种实现方法解析
2020/07/09 PHP
无语,javascript居然支持中文(unicode)编程!
2007/04/12 Javascript
9个javascript语法高亮插件 推荐
2009/07/18 Javascript
七夕情人节丘比特射箭小游戏
2015/08/20 Javascript
jQuery实现简单的点赞效果
2020/05/29 Javascript
JS转换HTML转义符的方法
2016/08/24 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
Bootstrap Table使用整理(一)
2017/06/09 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
2017/06/13 Javascript
深入浅出webpack之externals的使用
2017/12/04 Javascript
nodejs实现解析xml字符串为对象的方法示例
2018/03/14 NodeJs
JQuery中queue方法用法示例
2019/01/31 jQuery
在node中使用jwt签发与验证token的方法
2019/04/03 Javascript
vue-cli和v-charts实现可视化图表过程解析
2019/10/08 Javascript
Python探索之静态方法和类方法的区别详解
2017/10/27 Python
Python金融数据可视化汇总
2017/11/17 Python
Django中间件工作流程及写法实例代码
2018/02/06 Python
Python装饰器用法与知识点小结
2020/03/09 Python
通过Python扫描代码关键字并进行预警的实现方法
2020/05/24 Python
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
卫校中专生个人自我评价
2013/09/19 职场文书
物流专业大学的自我评价
2014/01/11 职场文书
小学生新学期寄语
2014/01/19 职场文书
如何撰写岗位职责
2014/02/01 职场文书
拓展策划方案
2014/06/03 职场文书
结婚堵门保证书
2015/05/08 职场文书
乡镇司法所2015年度工作总结
2015/10/14 职场文书
golang中的struct操作
2021/11/11 Golang
win11系统中dhcp服务异常什么意思? Win11 DHCP服务异常修复方法
2022/04/08 数码科技