对于软考中常见的kmp字符串模式匹配中next函数值的算法,一开始解决不知如何下手,经过多方查询有以下俩种解法:
第一种.首先应先理解以下名词前缀,后缀,部分匹配值
前缀: 指除了最后一个字符以外,一个字符串的全部头部组合
后缀: 指除了第一个字符以外,一个字符串的全部尾部组合
部分匹配值 :就是"前缀"和"后缀"的最长的共有元素的长度
以aba为例
"a"的前缀和后缀都为空集,共有元素的长度为0;
"ab"的前缀为[a],后缀为[b],共有元素的长度为0;
“aba"的前缀为[a, ab],后缀为[ba, a],共有元素为"a”,共有元素的长度1;
next数组:用来记录某个字符失配时j应该赋的值,与部分匹配值有关系。
第二种简易解法
j 1 2 3 4 5 6 7
模式串 a b a a b c a
next[j] 0 1 1 2 2 3 1
每个个位的解释
1.前两位必定为0和1。
2.计算第三位的时候,看第二位b的next值,为1,则把b和1对应的a进行比较,不同,则第三位a的next的值为1,因为一直比到最前一位,都没有发生比较相同的现象。
3.计算第四位的时候,看第三位a的next值,为1,则把a和1对应的a进行比较,相同,则第四位a的next的值为第三位a的next值加上1。为2。因为是在第三位实现了其next值对应的值与第三位的值相同。
4.计算第五位的时候,看第四位a的next值,为2,则把a和2对应的b进行比较,不同,则再将b对应的next值1对应的a与第四位的a进行比较,相同,则第五位的next值为第二位b的next值加上1,为2。因为是在第二位实现了其next值对应的值与第四位的值相同。
5.计算第六位的时候,看第五位b的next值,为2,则把b和2对应的b进行比较,相同,则第六位c的next值为第五位b的next值加上1,为3,因为是在第五位实现了其next值对应的值与第五位相同。
6.计算第七位的时候,看第六位c的next值,为3,则把c和3对应的a进行比较,不同,则再把第3位a的next值1对应的a与第六位c比较,仍然不同,则第七位的next值为1。