基于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 相关文章推荐
JS 自动安装exe程序
Nov 30 Javascript
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
Jun 02 Javascript
js Map List 遍历使用示例
Jul 10 Javascript
php与js的区别是什么
Aug 05 Javascript
javascript如何动态加载表格与动态添加表格行
Nov 27 Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
Dec 02 Javascript
将HTML格式的String转化为HTMLElement的实现方法
Aug 07 Javascript
js实现的奥运倒计时时钟效果代码
Dec 09 Javascript
详解angular element()方法使用
Apr 08 Javascript
react-router browserHistory刷新页面404问题解决方法
Dec 29 Javascript
JS如何操作DOM基于表格动态展示数据
Oct 15 Javascript
javascript数组includes、reduce的基本使用
Jul 02 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 无限级数据JSON格式及JS解析
2010/07/17 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
IE8对JS通过属性和数组遍历解析不一样的地方探讨
2013/05/06 Javascript
Jquery遍历节点的方法小集
2014/01/22 Javascript
点击标签切换和自动切换DIV选项卡
2014/08/10 Javascript
jquery增加和删除元素的方法
2015/01/14 Javascript
JavaScript设置、获取、清除单值和多值cookie的方法
2015/11/17 Javascript
jQuery中cookie插件用法实例分析
2015/12/04 Javascript
jQuery替换节点用法示例(使用replaceWith方法)
2016/09/08 Javascript
jQuery纵向导航菜单效果实现方法
2016/12/19 Javascript
Node.js websocket使用socket.io库实现实时聊天室
2017/02/20 Javascript
微信小程序 页面跳转及数据传递详解
2017/03/14 Javascript
JavaScript判断浏览器和hack滚动条的写法
2017/07/23 Javascript
详解Vue 动态组件与全局事件绑定总结
2018/11/11 Javascript
vue中keep-alive,include的缓存问题
2019/11/26 Javascript
[01:27]2014DOTA2展望TI 剑指西雅图IG战队专访
2014/06/30 DOTA
[01:52]2020年DOTA2 TI10夏季活动预告片
2020/07/15 DOTA
python提示No module named images的解决方法
2014/09/29 Python
在Mac OS上搭建Python的开发环境
2015/12/24 Python
tensorflow 1.0用CNN进行图像分类
2018/04/15 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
Python中关键字global和nonlocal的区别详解
2018/09/03 Python
对python判断是否回文数的实例详解
2019/02/08 Python
利用pyecharts实现地图可视化的例子
2019/08/12 Python
Django 拼接两个queryset 或是两个不可以相加的对象实例
2020/03/28 Python
浅谈html5增强的页面元素
2016/06/14 HTML / CSS
博士生求职信
2014/07/06 职场文书
乡镇干部党的群众路线教育实践活动个人对照检查材料
2014/09/24 职场文书
小学教育见习总结
2015/06/23 职场文书
小学语文教学随笔
2015/08/14 职场文书
学校扫黄打非工作总结
2015/10/15 职场文书
MySQL 视图(View)原理解析
2021/05/19 MySQL
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS
Python echarts实现数据可视化实例详解
2022/03/03 Python