基于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 触发事件列表 比较不错
Sep 03 Javascript
无缝滚动js代码通俗易懂(自写)
Jun 19 Javascript
JS+JSP checkBox 全选具体实现
Jan 02 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
Mar 13 Javascript
一个JavaScript防止表单重复提交的实例
Oct 21 Javascript
Javascript学习笔记之 函数篇(三) : 闭包和引用
Nov 23 Javascript
jQuery中click事件的定义和用法
Dec 20 Javascript
jQuery实现页面顶部下拉广告
Dec 30 Javascript
JavaScript实现图像模糊化的方法实例
Jan 15 Javascript
React 使用browserHistory项目访问404问题解决
Jun 01 Javascript
vue路由插件之vue-route
Jun 13 Javascript
vue+mock.js实现前后端分离
Jul 24 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中的Class的几点个人看法
2006/10/09 PHP
百度工程师讲PHP函数的实现原理及性能分析(一)
2015/05/13 PHP
PHP操作路由器实现方法示例
2019/04/27 PHP
强悍无比的WEB开发好助手FireBug(Firefox Plugin)
2007/01/16 Javascript
自己编写的类似JS的trim方法
2013/10/09 Javascript
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
2013/11/05 Javascript
面向切面编程(AOP)的理解
2015/05/01 Javascript
jQuery实现按钮只点击一次后就取消点击事件绑定的方法
2015/06/26 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
2015/10/19 Javascript
如何用angularjs制作一个完整的表格
2016/01/21 Javascript
Node.js中Request模块处理HTTP协议请求的基本使用教程
2016/03/31 Javascript
require、backbone等重构手机图片查看器
2016/11/17 Javascript
js数组操作方法总结(必看篇)
2016/11/22 Javascript
JS实现给对象动态添加属性的方法
2017/01/05 Javascript
jQuery+koa2实现简单的Ajax请求的示例
2018/03/06 jQuery
解决node修改后需频繁手动重启的问题
2018/05/13 Javascript
微信小程序动态增加按钮组件
2018/09/14 Javascript
小程序:授权、登录、session_key、unionId的详解
2019/05/15 Javascript
vue中$refs, $emit, $on, $once, $off的使用详解
2019/05/26 Javascript
vue项目创建步骤及路由router
2020/01/14 Javascript
一个小示例告诉你Python语言的优雅之处
2014/07/04 Python
对于Python的Django框架使用的一些实用建议
2015/04/03 Python
使用Python发送邮件附件以定时备份MySQL的教程
2015/04/25 Python
横向对比分析Python解析XML的四种方式
2016/03/30 Python
Python可变参数用法实例分析
2017/04/02 Python
Python使用re模块正则提取字符串中括号内的内容示例
2018/06/01 Python
numpy矩阵数值太多不能全部显示的解决
2020/05/14 Python
Python中openpyxl实现vlookup函数的实例
2020/10/28 Python
详解Open Folder as PyCharm Project怎么添加的方法
2020/12/29 Python
家长对小学生的评语
2014/01/28 职场文书
旷课检讨书500字
2014/10/14 职场文书
安阳殷墟导游词
2015/02/10 职场文书
大学生旷课检讨书1000字
2015/02/19 职场文书
2015年销售员工作总结范文
2015/04/07 职场文书
导盲犬小Q观后感
2015/06/11 职场文书
Nginx反向代理至go-fastdfs案例讲解
2021/08/02 Servers