基于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困惑—包装集 DOM节点
Oct 16 Javascript
js数组中如何随机取出一个值
Jun 13 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
Feb 27 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
Mar 07 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
Jun 28 Javascript
创建一般js对象的几种方式
Jan 19 Javascript
浅析JavaScript中var that=this
Feb 17 Javascript
js封装成插件_Canvas统计图插件编写实例
Sep 12 Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
Mar 18 Javascript
Vue验证码60秒倒计时功能简单实例代码
Jun 22 Javascript
JS实现的简单tab切换功能完整示例
Jun 20 Javascript
JavaScript中10个Reduce常用场景技巧
Jun 21 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
文件上传类
2006/10/09 PHP
利用php递归实现无限分类 格式化数组的详解
2013/06/08 PHP
PHP临时文件的安全性分析
2014/07/04 PHP
php实现与erlang的二进制通讯实例解析
2014/07/23 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
2014/12/15 PHP
php如何控制用户对图片的访问 PHP禁止图片盗链
2016/03/25 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
2016/07/06 PHP
thinkPHP通用控制器实现方法示例
2017/11/23 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
Javascript常考语句107条收集
2010/03/09 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
JavaScript通过代码调用Flash显示的方法
2016/02/02 Javascript
jQuery Easyui DataGrid点击某个单元格即进入编辑状态焦点移开后保存数据
2016/08/15 Javascript
微信小程序 less文件编译成wxss文件实现办法
2016/12/05 Javascript
BootStrap Table 获取同行不同列元素的方法
2016/12/19 Javascript
Bootstrap源码解读导航条(7)
2016/12/23 Javascript
js简易版购物车功能
2017/06/17 Javascript
js循环map 获取所有的key和value的实现代码(json)
2018/05/09 Javascript
vue项目前端微信JSAPI与外部H5支付相关实现过程及常见问题
2020/04/14 Javascript
Python使用metaclass实现Singleton模式的方法
2015/05/05 Python
Python实现的单向循环链表功能示例
2017/11/10 Python
通过pycharm使用git的步骤(图文详解)
2019/06/13 Python
python获取磁盘号下盘符步骤详解
2019/06/19 Python
Python使用Slider组件实现调整曲线参数功能示例
2019/09/06 Python
pytest中文文档之编写断言
2019/09/12 Python
完美解决jupyter由于无法import新包的问题
2020/05/26 Python
详解CSS3的opacity属性设置透明效果的用法
2016/05/09 HTML / CSS
图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传
2016/01/20 HTML / CSS
荷兰最大的鞋子、服装和运动折扣店:Bristol
2021/01/07 全球购物
ORACLE十问
2015/04/20 面试题
现场活动策划方案
2014/08/22 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书
加强作风建设工作总结
2014/10/23 职场文书
2016元旦文艺汇演主持词
2015/07/06 职场文书
python_tkinter事件类型详情
2022/03/20 Python