坏字符规则:
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一定是好后缀的子串
好后缀长度定义,从模式串尾部查找,直到遇到坏字符