基于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系列(14) 作用域链介绍(Scope Chain)
Apr 12 Javascript
AngularJS中取消对HTML片段转义的方法例子
Jan 04 Javascript
javascript弹出页面回传值的方法
Jan 28 Javascript
JS判断元素是否在数组内的实现代码
Mar 30 Javascript
JS创建事件的三种方法(实例代码)
May 12 Javascript
动态加载css方法实现和深入解析
Jan 18 Javascript
Vim快速合并行及vim 将文件所有行合并到一行
Nov 27 Javascript
JavaScript 日期时间选择器一些小结
Apr 02 Javascript
jQuery利用FormData上传文件实现批量上传
Dec 04 jQuery
vue 在methods中调用mounted的实现操作
Aug 07 Javascript
javascript this指向相关问题及改变方法
Nov 19 Javascript
vue+elementui通用弹窗的实现(新增+编辑)
Jan 07 Vue.js
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
全文搜索和替换
2006/10/09 PHP
php discuz 主题表和回帖表的设计
2009/03/13 PHP
php后台如何避免用户直接进入方法实例
2013/10/15 PHP
PHP实现克鲁斯卡尔算法实例解析
2014/08/22 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
php+ajax实现无刷新分页的方法
2014/11/04 PHP
php实现json编码的方法
2015/07/30 PHP
js判断变量是否空值的代码
2008/10/26 Javascript
通过action传过来的值在option获取进行验证的方法
2013/11/14 Javascript
JavaScript实现的in_array函数
2014/08/27 Javascript
javascript判断css3动画结束 css3动画结束的回调函数
2015/03/10 Javascript
JavaScript实现简单的tab选项卡切换
2016/01/05 Javascript
JS中多种方式创建对象详解
2016/03/22 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(一)
2016/05/17 Javascript
JavaScript实现打开链接页面的方式汇总
2016/06/02 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
2016/06/20 Javascript
javascript中Number的方法小结
2016/11/21 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
2017/08/31 Javascript
JavaScript字符串转数字的5种方法及遇到的坑
2018/07/16 Javascript
jQuery实现点击自身以外区域关闭弹出层功能完整示例【改进版】
2018/07/31 jQuery
记录vue项目中遇到的一点小问题
2019/05/14 Javascript
js实现三角形粒子运动
2020/09/22 Javascript
vue router-link 默认a标签去除下划线的实现
2020/11/06 Javascript
深入讲解Java编程中类的生命周期
2016/02/05 Python
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
2016/05/17 Python
深入浅析Python2.x和3.x版本的主要区别
2018/11/30 Python
python交换两个变量的值方法
2019/01/12 Python
Python中Subprocess的不同函数解析
2019/12/10 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
2020/05/27 Python
StubHub中国:购买和出售全球活动门票
2020/01/01 全球购物
物流管理专业职业生涯规划书
2014/01/06 职场文书
廉洁教育学习材料
2014/05/19 职场文书
群众路线教育党员自我剖析材料
2014/10/06 职场文书
68句权威创业名言
2019/08/26 职场文书
创业计划书之游泳馆
2019/09/16 职场文书
2019年“红色之旅”心得体会1000字(3篇)
2019/09/27 职场文书