基于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用户自定义类的类名称的代码
Mar 08 Javascript
深入理解JavaScript系列(7) S.O.L.I.D五大原则之开闭原则OCP
Jan 15 Javascript
JS弹出可拖拽可关闭的div层完整实例
Feb 13 Javascript
RequireJs的使用详解
Feb 19 Javascript
AngularJS实现根据不同条件显示不同控件
Apr 20 Javascript
JS使用正则表达式找出最长连续子串长度
Oct 26 Javascript
Vue 项目部署到服务器的问题解决方法
Dec 05 Javascript
Express进阶之log4js实用入门指南
Feb 10 Javascript
JS中获取 DOM 元素的绝对位置实例详解
Apr 23 Javascript
vue项目打包后打开页面空白解决办法
Jun 29 Javascript
vue如何自动化打包测试环境和正式环境的dist/test文件
Jun 06 Javascript
js实现简单掷骰子效果
Oct 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中文本操作的类
2007/03/17 PHP
PHP框架Laravel插件Pagination实现自定义分页
2020/04/22 PHP
PHP序列化操作方法分析
2016/09/28 PHP
php mysql获取表字段名称和字段信息的三种方法
2016/11/13 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
2017/02/07 PHP
PHP实现的支付宝支付功能示例
2019/03/26 PHP
制作特殊字的脚本
2006/06/26 Javascript
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
2010/08/03 Javascript
JavaScript 放大镜 移动镜片效果代码
2011/05/09 Javascript
THREE.JS入门教程(3)着色器-下
2013/01/24 Javascript
JavaScript通过RegExp实现客户端验证处理程序
2013/05/07 Javascript
javascript中定义私有方法说明(private method)
2014/01/27 Javascript
详解AngularJS控制器的使用
2016/03/09 Javascript
jQuery 限制输入字符串长度
2016/06/20 Javascript
Javascript的this用法
2017/01/16 Javascript
JS实现线性表的链式表示方法示例【经典数据结构】
2017/04/11 Javascript
详解JQuery基础动画操作
2019/04/12 jQuery
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
[50:02]完美世界DOTA2联赛PWL S2 Magma vs FTD 第三场 11.29
2020/12/03 DOTA
使用Python编写vim插件的简单示例
2015/04/17 Python
Python最基本的输入输出详解
2015/04/25 Python
Python下Fabric的简单部署方法
2015/07/14 Python
python3实现ftp服务功能(客户端)
2017/03/24 Python
Python找出最小的K个数实例代码
2018/01/04 Python
python MySQLdb使用教程详解
2018/03/20 Python
python读取中文txt文本的方法
2018/04/12 Python
django实现用户注册实例讲解
2019/10/30 Python
详解python 中in 的 用法
2019/12/12 Python
pytorch SENet实现案例
2020/06/24 Python
python switch 实现多分支选择功能
2020/12/21 Python
pytorch 中forward 的用法与解释说明
2021/02/26 Python
英国历史最悠久的DJ设备供应商:DJ Finance、DJ Warehouse、The DJ Shop
2019/09/04 全球购物
写演讲稿要注意的六件事
2014/01/14 职场文书
2014小学教师年度考核工作总结
2014/12/03 职场文书
大学生自荐信怎么写
2015/03/26 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书