KMP算法Lua实现

如下如有误,请指出,谢谢,解释均在注释中

参考:http://blog.csdn.net/yutianzuijin/article/details/11954939/

--求前缀字符
function getNext(str)
    local next = {[0] = 0,[1] = 0}
    local k = 0     --初始化最大前后缀长度为0
    for i = 2,#str do  --从第二个字符开始,依次计算每一个字符对应的next值
        --相等的话最大前后缀长度+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 next
end

function Str2CharTable(str)
    local t = {}
    for  chr in  string.gmatch(str, ".") do
        t[#t+1] = chr
    end
    return t
end 

function KmpFind(srcStr,findStr)
    local Next
    Next  =  getNext(findStr)
	print(table.concat(Next,","))
    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
			--移动位数 = 已匹配的字符数 - 对应的部分匹配值
			indexSrcStr = indexSrcStr + ( indexFindStr - Next[indexFindStr])
        end 
    end 
	if indexFindStr > #findStr  then
		return indexSrcStr - indexFindStr + 1,indexSrcStr - 1
	else
		return -1, -1
	end
end 


local srcStr,findStr
srcStr,findStr = Str2CharTable("BBCABCDABABCDABCDABDE"),Str2CharTable("ABCDABD")
local startPos,endPos = KmpFind(srcStr,findStr)
print(startPos,endPos)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骇客之技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值