KMP算法学习笔记(一)

来源:互联网 发布:女装从淘宝进货可以吗 编辑:程序博客网 时间:2024/06/04 19:44

参考原出处:http://www.cnblogs.com/aaronjs/p/4225442.html

var str1 = "BBC ABCDAB ABCDABCDABDE";    var str2 = "ABCDABD";    var xx = this.KMP(str1, str2);kmpGetStrPartMatchValue: function(str){        var prefix = [];        var suffix = [];        var partMatch = [];        var _len = str.length        for(var i = 0; i < _len; 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;                }            }        }        return partMatch;    },    KMP: function(sourceStr, searchStr){        //生成匹配表        var part = this.kmpGetStrPartMatchValue(searchStr);        var sourceLen = sourceStr.length;        var searchLen = searchStr.length;        var result;        var i = 0, j = 0;        for(; i < sourceLen; i++){  //最外层循环,主串            //子循环            for(var j = 0; j < searchLen; j++){                //如果与主串匹配                if(searchStr.charAt(j) == sourceStr.charAt(i)){                    //如果是匹配完成                    if(j == searchLen - 1 ){                        result = i - j;                        break;                    }else{                        //如果匹配到了就继续循环,i++是用来增加主串的下标位                        i++;                    }                }else{                    //在子串的匹配中i是被叠加了                    if(j > 1 && part[j - 1] > 0){                        i += (i - j - part[j - 1]);                    }else{                        //移动一位                        i = i - j;                    }                    break;                }            }            if(result || result == 0){                break;            }        }        if(result || result == 0){            return result;        }else{            return -1;        }    }


0 0
原创粉丝点击