基于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 相关文章推荐
datePicker——日期选择控件(with jquery)
Feb 20 Javascript
测试你的JS的掌握程度的代码
Dec 09 Javascript
javascript实现动态模态绑定grid过程代码
Sep 22 Javascript
jQuery中offsetParent()方法用法实例
Jan 19 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
Mar 12 Javascript
javascript遇到html5的一些表单属性
Jul 05 Javascript
说说AngularJS中的$parse和$eval的用法
Sep 14 Javascript
vue.js2.0点击获取自己的属性和jquery方法
Feb 23 jQuery
vue2.0 自定义 饼状图 (Echarts)组件的方法
Mar 02 Javascript
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
Dec 11 Javascript
js实现select下拉框选择
Jan 11 Javascript
JS代码检查工具ESLint介绍与使用方法
Feb 04 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实现小写金额转换大写金额的代码(精确到分)
2012/01/10 PHP
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
2014/06/27 PHP
destoon供应信息title调用出公司名称的方法
2014/08/22 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
基础的prototype.js常用函数及其用法
2007/03/10 Javascript
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
jquery 实现输入邮箱时自动补全下拉提示功能
2015/10/04 Javascript
vue axios登录请求拦截器
2018/04/02 Javascript
js正则相关知识点专题
2018/05/10 Javascript
vue+element-ui实现表格编辑的三种实现方式
2018/10/31 Javascript
js中arguments对象的深入理解
2019/05/14 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
design vue 表格开启列排序的操作
2020/10/28 Javascript
Python构造函数及解构函数介绍
2015/02/26 Python
python3简单实现微信爬虫
2015/04/09 Python
Python中使用copy模块实现列表(list)拷贝
2015/04/14 Python
python字符串编码识别模块chardet简单应用
2015/06/15 Python
Python基于PycURL自动处理cookie的方法
2015/07/25 Python
python3 pandas 读取MySQL数据和插入的实例
2018/04/20 Python
Pycharm 操作Django Model的简单运用方法
2018/05/23 Python
Python基于SMTP协议实现发送邮件功能详解
2018/08/14 Python
pycharm创建scrapy项目教程及遇到的坑解析
2019/08/15 Python
anaconda升级sklearn版本的实现方法
2021/02/22 Python
Kate Spade澳大利亚官方网站:美国设计师手袋品牌
2019/09/10 全球购物
主题酒店策划书
2014/01/28 职场文书
仓管岗位职责范本
2014/02/08 职场文书
出纳员岗位职责风险
2014/03/06 职场文书
2014年医学生毕业自我鉴定
2014/03/26 职场文书
调查研究项目计划书
2014/04/29 职场文书
电钳工人个人求职信
2014/05/10 职场文书
党员“四风”问题批评与自我批评思想汇报
2014/10/06 职场文书
教师节横幅标语
2014/10/08 职场文书
正风肃纪剖析材料范文
2014/10/10 职场文书
关于长城的导游词
2015/01/30 职场文书
毕业晚宴祝酒词
2015/08/11 职场文书