基于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实现自定义标签
May 08 Javascript
二行代码解决全部网页木马
Mar 28 Javascript
基于jQuery的试卷自动排版系统实现代码
Jan 06 Javascript
JS文本获得焦点清除文本文字的示例代码
Jan 13 Javascript
JQuery EasyUI 加载两次url的原因分析及解决方案
Aug 18 Javascript
Vue.js每天必学之内部响应式原理探究
Sep 07 Javascript
纯js实现html转pdf的简单实例(推荐)
Feb 16 Javascript
jQuery实现点击下拉框中的值累加到文本框中的方法示例
Oct 28 jQuery
小程序实现授权登陆的解决方案
Dec 02 Javascript
浅谈Vue.js组件(二)
Apr 09 Javascript
vue使用openlayers实现移动点动画
Sep 24 Javascript
在vue中使用Echarts画曲线图的示例
Oct 03 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和ACCESS写聊天室(六)
2006/10/09 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
表单的一些基本用法与技巧
2006/07/15 Javascript
无缝滚动改进版支持上下左右滚动(封装成函数)
2012/12/04 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
jquery中文乱码的多种解决方法
2013/06/21 Javascript
Javascript学习笔记之函数篇(五) : 构造函数
2014/11/23 Javascript
node.js中的fs.realpath方法使用说明
2014/12/16 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
2015/06/24 Javascript
理解javascript中的原型和原型链
2015/07/30 Javascript
Google 地图获取API Key详细教程
2016/08/06 Javascript
详解Node.js如何开发命令行工具
2016/08/14 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
Centos7 中安装 Node.js v4.4.4
2016/11/03 Javascript
javascript中的面向对象
2017/03/30 Javascript
使用Vue动态生成form表单的实例代码
2018/04/26 Javascript
详解js动态获取浏览器或页面等容器的宽高
2019/03/13 Javascript
Angular CLI 使用教程指南参考小结
2019/04/10 Javascript
重置Redux的状态数据的方法实现
2019/11/18 Javascript
解决vue cli4升级sass-loader(v8)后报错问题
2020/07/30 Javascript
Echarts.js无法引入问题解决方案
2020/10/30 Javascript
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
详解tensorflow实现迁移学习实例
2018/02/10 Python
python删除本地夹里重复文件的方法
2020/11/19 Python
利用pandas进行大文件计数处理的方法
2018/07/25 Python
python selenium 弹出框处理的实现
2019/02/26 Python
python openpyxl使用方法详解
2019/07/18 Python
django 连接数据库 sqlite的例子
2019/08/14 Python
PyCharm 在Windows的有用快捷键详解
2020/04/07 Python
通过Python扫描代码关键字并进行预警的实现方法
2020/05/24 Python
如何利用cmp命令比较文件
2016/04/11 面试题
物业管理大学生个人的自我评价
2013/10/10 职场文书
小学生家长评语大全
2014/02/10 职场文书
员工薪酬激励方案
2014/06/13 职场文书
商铺门面租房协议书
2014/10/21 职场文书
领导激励员工的演讲稿,各种会上用得到,建议收藏
2019/08/13 职场文书