• KMP算法的JavaScript实现


      刚才看到新闻频道转截的一篇文章:阮一峰:字符串匹配的KMP算法,图文并茂通俗易懂,就用JS实现了一下,现分享出来。

      算法的核心是部分匹配表和回退算法,部分匹配表的实现如下:

    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

      欢迎交流讨论。

    版权

    作者:Artwl

    出处:http://artwl.cnblogs.com

    本文首发博客园,版权归作者跟博客园共有。转载必须保留本段声明,并在页面显著位置给出本文链接,否则保留追究法律责任的权利。

  • 相关阅读:
    Css_加载样式
    Mvc4_@RenderBody()和@RenderSection()
    C#_观察者模式
    Mvc4_MvcPager 概述
    Mvc4_Area的应用
    Nginx 服务器性能参数设置
    Nginx变量的实现机制
    天下无雾
    Nginx Http框架的理解
    【转】websocket协议规范
  • 原文地址:https://www.cnblogs.com/artwl/p/3054434.html
Copyright © 2020-2023  润新知