如下如有误,请指出,谢谢,解释均在注释中
参考:http://blog.csdn.net/yutianzuijin/article/details/11954939/
--求前缀字符function getNext(str)local next = {[0] = 0,[1] = 0}local k = 0 --初始化最大前后缀长度为0for i = 2,#str do --从第二个字符开始,依次计算每一个字符对应的next值--相等的话最大前后缀长度+1,否则赋值为0if str[i] == str[k+1] then--保存此次最大前后缀长度,保存在数组中和保存在k中给下个字符使用k = k + 1next[i] = kelsek = 0next[i] = kendendreturn nextendfunction Str2CharTable(str)local t = {}for chr in string.gmatch(str, ".") dot[#t+1] = chrendreturn tendfunction KmpFind(srcStr,findStr)local NextNext = getNext(findStr)print(table.concat(Next,","))local indexSrcStr, indexFindStr = 1,1while ( indexSrcStr <= #srcStr and indexFindStr <= #findStr ) doif srcStr[indexSrcStr] == findStr[indexFindStr] thenindexSrcStr = indexSrcStr + 1indexFindStr = indexFindStr + 1else--移动位数 = 已匹配的字符数 - 对应的部分匹配值indexSrcStr = indexSrcStr + ( indexFindStr - Next[indexFindStr])endendif indexFindStr > #findStr thenreturn indexSrcStr - indexFindStr + 1,indexSrcStr - 1elsereturn -1, -1endendlocal srcStr,findStrsrcStr,findStr = Str2CharTable("BBCABCDABABCDABCDABDE"),Str2CharTable("ABCDABD")local startPos,endPos = KmpFind(srcStr,findStr)print(startPos,endPos)
