BM算法详解
原帖链接: BM算法详解 来源 在没有BM算法时,其原始算法是从后往前进行匹配,需要两层循环,判断以某个字符为结尾的子串是否和模式串相等,这种算法也称作暴搜; 贴上代码: void BLS( string s, string p) { int s_len = s. size (), p_len = p. size (); int j = 0 , i = 0 ; while (j <= s_len - p_len) { for (i = p_len - 1 ; i >= 0 && p[i] == s[i + j]; --i) {} if (i < 0 ) { cout << "match: " << i + j + 1 << endl; j += p_len; } else j++; } } 算法的思想还是比较容易理解的,i和j分别指的是,模式串中已经匹配的位数,模式串相对于原串移动的位数; 算法包含了两个重要的内容,分别是好后缀和坏字符的规则; 坏字符 :当模式串和原串的字符并不匹配时,原串中的字符就称为坏字符; 好后缀 :模式串和原串的字符相等时所有的字符串,比如ABCD和BCD,那么它的好后缀则包括第一次匹配的D,和第二次匹配的CD,还有第三次的BCD; 例子: BM算法的向右移动模式串的距离就是取坏字符和好后缀算法得到的最大值; 这两个内容分别拥有着几条规则,需要注意: