基于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 相关文章推荐
获取当前点击按钮的id用this.id实现
Mar 17 Javascript
js确认删除对话框适用于a标签及submit
Jul 10 Javascript
JavaScript脚本库编写的方法
Dec 09 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
Sep 19 Javascript
详解Vue.js Mixins 混入使用
Sep 15 Javascript
vue打包后显示空白正确处理方法
Nov 01 Javascript
vue 实现通过手机发送短信验证码注册功能
Apr 19 Javascript
在vue.js中使用JSZip实现在前端解压文件的方法
Sep 05 Javascript
bootstrap table表格插件之服务器端分页实例代码
Sep 12 Javascript
vue项目中实现图片预览的公用组件功能
Oct 26 Javascript
express中static中间件的具体使用方法
Oct 17 Javascript
微信小程序仿抖音短视频切换效果的实例代码
Jun 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伪静态写法附代码
2008/06/20 PHP
解析php下载远程图片函数 可伪造来路
2013/06/25 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
实现laravel 插入操作日志到数据库的方法
2019/10/11 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
js获取IFRAME当前的URL的方法
2013/11/13 Javascript
邮箱下拉自动填充选择示例代码附图
2014/04/03 Javascript
推荐JavaScript实现继承的最佳方式
2014/11/11 Javascript
浅谈EasyUI中编辑treegrid的方法
2015/03/01 Javascript
Javascript中实现String.startsWith和endsWith方法
2015/06/10 Javascript
Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定)
2016/11/22 Javascript
Javascript中常用类型的格式化方法小结
2016/12/26 Javascript
JavaScript数据结构之二叉树的计数算法示例
2017/04/13 Javascript
Angular实现模版驱动表单的自定义校验功能(密码确认为例)
2018/05/17 Javascript
解决Vue+Element ui开发中碰到的IE问题
2018/09/03 Javascript
用实例分析Python中method的参数传递过程
2015/04/02 Python
Python中Django框架下的staticfiles使用简介
2015/05/30 Python
python打包压缩、读取指定目录下的指定类型文件
2018/04/12 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
Python 3.8 新功能大揭秘【新手必学】
2020/02/05 Python
Python基于Twilio及腾讯云实现国际国内短信接口
2020/06/18 Python
Python基于httpx模块实现发送请求
2020/07/07 Python
Python实现删除某列中含有空值的行的示例代码
2020/07/20 Python
Django后端按照日期查询的方法教程
2021/02/28 Python
Rossignol金鸡美国官网:始于1907年法国百年雪具品牌
2019/03/06 全球购物
英国羊皮鞋类领先品牌:Just Sheepskin
2019/12/12 全球购物
自然健康的概念:Natural Healthy Concepts
2020/01/26 全球购物
《有趣的发现》教学反思
2014/04/15 职场文书
会计系毕业求职信
2014/08/07 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
教师群众路线剖析材料
2014/09/29 职场文书
工厂标语大全
2014/10/06 职场文书
大学生暑期社会实践证明范本
2014/10/24 职场文书
餐厅保洁员岗位职责
2015/04/10 职场文书
转正申请报告格式
2015/05/15 职场文书
Python进度条的使用
2021/05/17 Python