lua实现KMP算法

来源:互联网 发布:淘宝合伙开店协议 编辑:程序博客网 时间:2024/05/16 09:45

如下,有误,请指出,谢谢

function KmpHelperFun(str)    local next= {}    --i:模版字符串下标    next[1] = 0; -- 第一个字符对应的最大前后缀长度为0    local k = 0     --初始化最大前后缀长度为0    for i = 2,# str do  --从第二个字符开始,依次计算每一个字符对应的next值        while( k > 0 and  (str[i] ~= str[k+1]) ) do        --算法核心            k = next[k]         end             --相等的话最大前后缀长度+1,否则赋值为0        if str[i] == str[k+1] then            --保存此次最大前后缀长度,保存在数组中和保存在k中给下个字符使用            k = k + 1            next[i] = k        else            k = 0            next[i] = k        end     end    return nextendfunction Str2CharTable(str)    local t = {}    for  chr in  string.gmatch(str, ".") do        t[#t+1] = chr    end    return tend function KmpFind(srcStr,findStr)    local t ={}    t  = KmpHelperFun(findStr)    local indexSrcStr, indexFindStr = 1,1    while ( indexSrcStr <= #srcStr  and  indexFindStr <= #findStr ) do        if srcStr[indexSrcStr] == findStr[indexFindStr] then            indexSrcStr =  indexSrcStr +1            indexFindStr = indexFindStr+1        else            --第一位不匹配,主字符指针后移            if indexFindStr == 1 then                indexSrcStr = indexSrcStr +1            else                --最长前后缀之后的第 1 位                indexFindStr = t [indexFindStr -1 ] + 1            end        end     end     if indexFindStr  >  #findStr  then        return indexSrcStr  - indexFindStr + 1,indexSrcStr -1    else        return -1,-1    end    end     local srcStr,findStr    srcStr,findStr = Str2CharTable("annbcdanacadsannacanna"),Str2CharTable("annacanna")    local startPos,endPos = KmpFind(srcStr,findStr)    print(startPos,endPos)
0 0
原创粉丝点击