繁体   English   中英

关于KMP算法的预处理功能实现

[英]About KMP algorithm preprocessing function implementation

只是尝试实现KMP算法,但是当我尝试在Internet上进行检查时,结果发现这里有两个不同的版本:

解决方案1:

function computeLPSArray(str){
    var j = -1, i = 0;
    var arr = [];
    arr[0] = j;
    while(i < str.length){
        if(j == -1||str[i]==str[j]){
            i++;
            j++;
            arr[i] = j;
        } else {
            j = arr[j];
        }
    }
    return arr;
}

解决方案2:

function computeLPSArray(pat){
    var lps = [];
    var len = 0, i;
    lps[0] = 0;
    i = 1;
    while(i < pat.length){
        if(pat[i] == pat[len]){
            len++;
            lps[i] = len;
            i++;
        } else {
            if(len != 0){
                len = lps[len-1];
            } else {
                lps[i++] = 0;
            }
        }
    }
    return lps;
}

解决方案2来自geeksforgeeks。 为什么不先解决?

使用Solution1时,是否有任何极端情况会失败?

谢谢...

并非如此-两个版本都可以用来执行相同的任务。 故障链接数组的用法略有不同,但是算法的复杂性相同,并且两种方法都是正确的。

在一种方法中,失败链接是最长的适当后缀的长度,该长度也是适当的前缀(这将是版本2),而在第一个版本中,该长度要短1。 如您所见,这两个数组是等效的,可以通过加/减1将它们从一个转换为另一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM