基于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 相关文章推荐
基于jquery实现一张图片点击鼠标放大再点缩小
Sep 29 Javascript
js判断字符长度以及中英文数字等
Dec 31 Javascript
超级简单实现JavaScript MVC 样式框架
Mar 24 Javascript
ES6的新特性概览
Mar 10 Javascript
Bootstrap幻灯片轮播图支持触屏左右手势滑动的实现方法
Oct 13 Javascript
angular和BootStrap3实现购物车功能
Jan 25 Javascript
快速将Vue项目升级到webpack3的方法步骤
Sep 14 Javascript
jquery获取transform里的值实现方法
Dec 12 jQuery
Vue路由history模式解决404问题的几种方法
Sep 29 Javascript
详解小程序之简单登录注册表单验证
May 13 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
Jul 20 Javascript
vue实现广告栏上下滚动效果
Nov 26 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
音乐朗读剧《MARS RED》2021年TV动画化决定!
2020/03/06 日漫
php中Swoole的热更新实现代码实例
2021/03/04 PHP
jQuery.extend()的实现方式详解及实例
2013/06/29 Javascript
js导出table到excel同时兼容FF和IE示例
2013/09/03 Javascript
javascript实现数组内值索引随机化及创建随机数组的方法
2015/08/10 Javascript
通过原生JS实现为元素添加事件的方法
2016/11/23 Javascript
bootstrap table配置参数例子
2017/01/05 Javascript
Vue.js学习示例分享
2017/02/05 Javascript
element上传组件循环引用及简单时间倒计时的实现
2018/10/01 Javascript
微信公众号开发之微信支付代码记录的实现
2019/10/16 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
2020/10/30 Javascript
[58:32]EG vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python中关键字nonlocal和global的声明与解析
2017/03/12 Python
对Python信号处理模块signal详解
2019/01/09 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
基于python的列表list和集合set操作
2019/11/24 Python
python 实现turtle画图并导出图片格式的文件
2019/12/07 Python
Django调用百度AI接口实现人脸注册登录代码实例
2020/04/23 Python
python定时截屏实现
2020/11/02 Python
CSS3 对过渡(transition)进行调速以及延时
2020/10/21 HTML / CSS
基于html5绘制圆形多角图案
2016/04/21 HTML / CSS
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
vue 中 get / delete 传递数组参数方法
2021/03/23 Vue.js
中专自我鉴定范文
2013/10/16 职场文书
最新大学职业规划书范文
2013/12/30 职场文书
2014年单位植树节活动方案
2014/03/23 职场文书
学年个人总结范文
2015/03/05 职场文书
学校党支部公开承诺书
2015/04/30 职场文书
升学宴学生致辞
2015/09/29 职场文书
三下乡活动心得体会
2016/01/23 职场文书
培训心得体会怎么写
2016/01/25 职场文书
《小摄影师》教学反思
2016/02/18 职场文书
2019财务毕业实习报告
2019/06/27 职场文书
tensorflow中的数据类型dtype用法说明
2021/05/26 Python
MySQL 时间类型的选择
2021/06/05 MySQL