1. 简单算法
如下图例子举例算法
简单算法应当是,找到串1和中和串2第一个字母相同的,而后往下进行匹配,若是匹配不成功串1就回到此次匹配到的第一个相同字母的下一个字母进行匹配。这样可能会致使不少的回溯。字符串
假如串1是: abcd abcd abcd abcd,那么可能会致使原本长度是16,5的串要多扫描5×2×4遍。原理
KMP(Knuth-Morris-Pratt)im
KMP算法用于只有一个匹配字符串的时候可用,其原理是利用了须要匹配的串,这里是串2自己的信息。在KMP算法中,如图匹配到第五个字符的时候发现不对后并非如上面的普通算法那样直接回到头上,而是看串2中已经匹配到的部分有没有首尾呼应的部分,如:“a b c a” 中头尾上两个a就同样,这样就串1就从e开始匹配,而串2就从b开始匹配。img
这样作的好处,并非能够节省串2的匹配,而是经过这样子能够不在串1上作回溯,也就是说,在已经匹配过的字符串里,除了头尾呼应的部分不可能再有属于下个匹配字符串的部分。因此只须要识别出首尾呼应的字符串便可。时间
KMP算法的时间复杂度是O(m+n)。字符
BM(Boyer-Moore)ab
BM算法比较奇特的地方是从后面往前面匹配,即看串2中最后一个字母是否匹配。
只要最后一个字母不匹配,就能够推断当前串1中对应的子串和串2不同。而且当字母e和a不匹配的时候,串1中的字母e便被称为坏字符。对于坏字符的处理能够分两种状况:
1)像下图中所示,字母e不在串2中,因此能够直接跳过这个字母,由于包含了这个字母子串都不可能和串2匹配。
2)该字母在串2中出现了,则将该字符匹配到串2中离末端最近的那个相同的字符上,假以下图中字符e是a,则应该将串2右移一位,将串1的第五个字符对应上串2的第四个字符。
那若是最后一个字母匹配了呢?那就依次往前匹配。