如下如有误,请指出,谢谢,解释均在注释中
参考: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)