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

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

    1. --求前缀字符
    2. function getNext(str)
    3. local next = {[0] = 0,[1] = 0}
    4. local k = 0 --初始化最大前后缀长度为0
    5. for i = 2,#str do --从第二个字符开始,依次计算每一个字符对应的next
    6. --相等的话最大前后缀长度+1,否则赋值为0
    7. if str[i] == str[k+1] then
    8. --保存此次最大前后缀长度,保存在数组中和保存在k中给下个字符使用
    9. k = k + 1
    10. next[i] = k
    11. else
    12. k = 0
    13. next[i] = k
    14. end
    15. end
    16. return next
    17. end
    18. function Str2CharTable(str)
    19. local t = {}
    20. for chr in string.gmatch(str, ".") do
    21. t[#t+1] = chr
    22. end
    23. return t
    24. end
    25. function KmpFind(srcStr,findStr)
    26. local Next
    27. Next = getNext(findStr)
    28. print(table.concat(Next,","))
    29. local indexSrcStr, indexFindStr = 1,1
    30. while ( indexSrcStr <= #srcStr and indexFindStr <= #findStr ) do
    31. if srcStr[indexSrcStr] == findStr[indexFindStr] then
    32. indexSrcStr = indexSrcStr + 1
    33. indexFindStr = indexFindStr + 1
    34. else
    35. --移动位数 = 已匹配的字符数 - 对应的部分匹配值
    36. indexSrcStr = indexSrcStr + ( indexFindStr - Next[indexFindStr])
    37. end
    38. end
    39. if indexFindStr > #findStr then
    40. return indexSrcStr - indexFindStr + 1,indexSrcStr - 1
    41. else
    42. return -1, -1
    43. end
    44. end
    45. local srcStr,findStr
    46. srcStr,findStr = Str2CharTable("BBCABCDABABCDABCDABDE"),Str2CharTable("ABCDABD")
    47. local startPos,endPos = KmpFind(srcStr,findStr)
    48. print(startPos,endPos)