串的顺序存储
字符串的模式匹配
字符串 KMP算法
KMP:利用好模式串本身的信息,当发生失配时,判断从哪个位置开始匹配。这个信息只与模式串有关,与主串无关。
匹配过程中,当发生不匹配的时候:如果j=1,那么令 j=0, i++, j++ ;如果 j > 1 ,那么主串 i 的指针不变,j 转化为KMP计算出的位置,继续匹配。
用KMP优化之后的串的匹配过程中,主串指针 i 不需要回溯。
求KMP的next数组
KMP在acwing的课程:链接: link
KMP在B站的课程:链接: link
//求KMP的next数组的代码
//其中T是模式串
for (int i=2, j=0; i<=n; i++ ){
while(j && T[i]!=T[j+1]) j=next[j];
if(T[i] == T[j+1]) j++;
next[i]=j;
}
考研中要求掌握手算的求KMP的next数组的方法
next[1]永远是0,next[2]永远是1
KMP算法的优化
(对KMP算法的优化本质上只是优化next[ ]为nextval[ ])
next[ ]考虑的是不匹配划线之前的
nextval[ ]考虑的是不匹配划线之前和不匹配的那一位,在nextval[ ]算之前要算好next[ ]
并不是所有的next[ ]都能进行优化
先算next[ ],再算在nextval[ ],nextval[0]无脑=0,之后再算nextval[ ]
Next[ ]数组和Nextval[ ]数组主要掌握手算的方法就可以了
一定要记得做课后题