字符串查找

KMP子字符串查找算法分析与实现

戏子无情 提交于 2019-12-11 06:10:09
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 原创博客,转载请注明 http://my.oschina.net/BreathL/blog/137916 子字符串查找,是程序设计的一个基本且普遍的问题。通常情况下子字符串查找不需要特别的设计,一是由于执行的次数不多,二是查找字符串一般也较短,所以不会形成性能的瓶颈;但如果你的程序里有大量的查找或长字符串的子串查找,也许就需要考虑特别的设计已保证程序的效率。 暴力查找算法: 大部分语言默认的子字符串查找都是使用的暴力查找算法,思路很简单,就是逐个取出 待 查找的字符串的字节,然后依次和被包含的子字符串的字节比较,从以第一个开始,若相等,则各自取下一个继续比较;若不相等,则 待 查找的字符串回退回去到起始比较处的下一个字节,而子字符串从头开始取,然后以此循环的比较。 可以优化: 它的算法复杂度是 N*M 这个量级的,但有个问题是:当匹配失败后, 待 查找的字符串回退回去到起始比较处的下一个字节,而子字符串从头开始取时,紧接着的几步比较可能是 多余的计算。因为前X已经匹配上了,说明临近X个字节已知了,那就可以根据已知的情况去掉一些重复的比较,这就KMP子字符串查找算法的优化原理。这么说可能有些模糊,举个例子: 带查找字符串: F Y Y Y Y U H N Z Y Y Y Y 目标字符串: F Y Y Y Y M