字符串BM算法

坏字符规则:

generateBadChar(b,m,hash); //构建坏字符哈希表,对应字符在模式串中的位置,如相同则靠最右

 for(j = m -1; j >= 0; --j)  //模式串从后往前匹配
        {
            if(a[i+j] != b[j])
                break;  //坏字符对应模式串中的下标是j
        }

出现坏字符时对应模式串的下标是j

i = i + (j - badchar[int(a[i+j])]); 

badchar[int(a[i+j])]找出坏字符对应模式串的下标

移动j - badchar[int(a[i+j])]让主串和模式串的坏字符对齐

好后缀

公共后缀子串长度(模式串尾部取k个出来),公共子串从i=0开始,分别比较,求出所有长度对应的起始坐标I,i范围[0,m-2],如果有多个相同长度的子串,被赋值覆盖,存较大的,suffix[k]存的是对应模式串的下标,故只需要找出坏字符在模式串中的下标,移动j-suffix[k]+1位即可

如果查找过程中查找到模式串的头部了,则公共后缀子串也是模式串的前缀子串,prefix[k]

查找过程为:

  • 在模式串中,查找跟好后缀匹配的另一个子串 case 1
  • 在好后缀的后缀子串中,查找最长的、能跟模式串前缀子串匹配的后缀子串 case 2

一定是case1中找不到匹配的好后缀,才跳case2,所以case2一定是好后缀的子串

好后缀长度定义,从模式串尾部查找,直到遇到坏字符

发布了47 篇原创文章 · 获赞 20 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/boiled_water123/article/details/104247095