基于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 静态页面实现随机显示广告的办法
Nov 17 Javascript
JS仿flash上传头像效果实现代码
Jul 18 Javascript
window.open()详解及浏览器兼容性问题示例探讨
May 29 Javascript
Javascript 构造函数详解
Oct 22 Javascript
jQuery form 表单验证插件(fieldValue)校验表单
Jan 24 Javascript
Node.js操作mysql数据库增删改查
Mar 30 Javascript
js剪切板应用clipboardData实例解析
May 29 Javascript
Javascript中的prototype与继承
Feb 06 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
Aug 19 Javascript
解决antd日期选择组件,添加value就无法点击下一年和下一月问题
Oct 29 Javascript
javascript实现搜索筛选功能实例代码
Nov 12 Javascript
微信小程序绘制半圆(弧形)进度条
Nov 18 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通过隐藏表单控件获取到前两个页面的url
2014/09/09 PHP
PHP判断数据库中的记录是否存在的方法
2014/11/14 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
2015/08/31 PHP
php自定义截取中文字符串-utf8版
2017/02/27 PHP
网站404页面3秒后跳到首页的实例代码
2013/08/16 Javascript
使用JavaScript实现Java的List功能(实例讲解)
2013/11/07 Javascript
nodeJS代码实现计算交社保是否合适
2015/03/09 NodeJs
jQuery中prepend()方法使用详解
2015/08/11 Javascript
封装属于自己的JS组件
2016/01/27 Javascript
快速使用Bootstrap搭建传送带
2016/05/06 Javascript
JS从数组中随机取出几个数组元素的方法
2016/08/02 Javascript
jQuery遍历节点树方法分析
2016/09/08 Javascript
three.js快速入门【推荐】
2017/01/21 Javascript
Vue结合SignalR实现前后端实时消息同步
2017/09/19 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
Angular4学习教程之DOM属性绑定详解
2018/01/04 Javascript
如何利用@angular/cli V6.0直接开发PWA应用详解
2018/05/06 Javascript
在vue中v-bind使用三目运算符绑定class的实例
2018/09/29 Javascript
给localStorage设置一个过期时间的方法分享
2018/11/06 Javascript
微信小程序上传图片到php服务器的方法
2019/05/23 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
jQuery实现移动端图片上传预览组件的方法分析
2020/05/01 jQuery
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
python基于phantomjs实现导入图片
2016/05/13 Python
Python判断两个对象相等的原理
2017/12/12 Python
Matlab中plot基本用法的具体使用
2020/07/17 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
python处理写入数据代码讲解
2020/10/22 Python
意大利消费电子产品购物网站:SLG Store
2019/12/26 全球购物
介绍一下gcc特性
2015/10/31 面试题
实习评语
2013/12/16 职场文书
社区敬老月活动实施方案
2014/02/17 职场文书
农林环境专业求职信
2014/03/13 职场文书
单位委托书范本(3篇)
2014/09/18 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
大明湖导游词
2015/02/03 职场文书