zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    006_02SQLite_OpenHelper
    006_01SQLite_demo
    005_01XML_Serilizer
    004_05PullParser
    004_04SharedPreferences
    004_02文件读写模式
    004_01获取SD容量
    003_01电话拨号器
    maven项目中的pom.xml
    ORACLE提示表名无效
  • 原文地址:https://www.cnblogs.com/artwl/p/3054434.html
Copyright © 2011-2022 走看看