第四章总结
什么是串?
串是由零个或多个字符组成的有序序列,记
S=‘a1a2a3…an’;
空串即长度为0的串,空格串是较特殊的串,不属于空串,串长等于空格数。
串的存储结构
重点
串匹配,也称模式匹配
串匹配方法有暴力匹配与KMP匹配算法;
暴力匹配:简单,不做赘述。
KMP算法:核心next数组,这玩意就是前缀与后缀相等的字符的最长长度,为啥要求这个呢?都知道暴力匹配指针需要回溯,而next的目的就是去除主串回溯问题。怎么做到的呢?例如一个串长11,当匹配的时候,假如该串的第四个元素失配,而next[4] = 1,next【4】= 1也就是第四个元素的前3个元素的前后缀相同的最大长度为1,此时保持主串指针不动,移动子串,关键是移动几位呢,这就关系到next数组了,得理解next数组的含义,子串向后移动的位数为Move = 已匹配位数 - next【4】,因为是第四位失配,所以已匹配位数为3,而next【4】= 1,因此移动位数为Move = 3 - 1 =2;下面是关键,因为根据next数组的含义,前三个元素的前缀和后缀相同的最长长度为1,如下图
主串与模式串第四位失配,第四位的前三位为aba,前缀为{a,ab},后缀为{a,ba} 取前后缀交集,得{a},前后缀相同的为a,长度为1,即模式串的next【4】= 1,也就是第一位与第三位相同,第四位匹配失败,就把第一个a移动到下一个a处,而移动到下一个a的移动位数就为Move = 已匹配位数 - next【4】 = 2;如果前后缀相同的子串为{a,ab},则最大长度为2,即next【4】 = 2,移动就是把开头的ab对应到下一个ab,next的作用就是失配时,子串后移的问题。注意,子串指针得移动到j = next[4]+1,因为最大长度是1,只需把a移到下一个a,子串指针指向a的下一位即可。(讲得已经很口水话了)。以上求的next数组定义是这样的next[1] = -1;next[2] = 0;还有一种是next[1] = 0;next[2] = 1;后者与前者的不同在于后者得出的每一个元素的next总是比前者大1,对于第二种定义,子串回溯到j = next[j]即可;
还有一个nextval数组,可参考B站 https://www.bilibili.com/video/BV1d54y1q7ko/?spm_id_from=333.337.search-card.all.click&vd_source=13cb0308676af1256761c51e3bb2ba69,就是继承第一个祖先的next。