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