标签:turn 测试结果 style 前缀 代码 ssi string http 匹配
next[j]表示当前模式串T的j下标对目标串S的i值失配时,我们应该使用模式串的下标为next[j]接着去和目标串失配的i值进行匹配
我们可以知道next除了j=1时,next[1]为0,其他情况都是比较前缀和后缀串的相似度(第三种情况是当相似度为0时,next值为0+1=1)
next数组,是用来评判前后缀的相识度,而next值,则是等于相似度加一
虽然我们知道是比较前后缀的相似度,但是我们如何确定前后缀位置来获取next值。---->pj的next值取决于 前缀p1p2....pk-1 后缀pj-k+1.....pj-1 的相似度,next值是相似度加一
pj的next值取决于 前缀p1p2....pk-1 后缀pj-k+1.....pj-1 的相似度,是相似度加一。 我们将k-1=m,其中m就是相似度,k就是next数组值-->Max{K} pj的next值取决于 前缀p1p2....pm 后缀pj-m.....pj-1 的相似度,是相似度加一。
那么我们现在的任务,就由找k-1变为找m,找相似度
例如:
虽然我们可以直接看出abab的相似度是2,
也可以编写函数获取到其相似度,
而且当我们求下一个next值时,串变为ababa,这时我们也可以看出相似度为3,使用同一个函数可以实现获取到相似度。
但是我们这个函数大概就是从头或尾开始索引,进行判断。
每次我们获取到了子串都要交给这个函数从头到尾去索引获取相似度,似乎不划算,我们是不是应该有更好的方法增加程序的性能?
next数组,是用来评判前后缀的相识度,而next值,则是等于相似度加一
next[j]表示当前模式串T的j下标对目标串S的i值失配时,我们应该使用模式串的下标为next[j]接着去和目标串失配的i值进行匹配
注意:匹配完毕后后缀会向下加一
重点:这个m值取决于上次失配时的next[]值,即上次j=3是失配了,所有m=next[3]=1,所以我们选取的前缀为p1=‘a‘,后缀为pj-1是‘a‘
重点:若是上次匹配成功。并未失配,那么我们的m值在上一次的基础上加1。所以这次m=2,我们选取前缀p1p2和后缀p3p4
因为前面匹配成功,所有m++,m=3所以前缀为p1p2p3,后缀为p3p4p5
由于上面失配了,所以m=next[7]=2,匹配前缀p1p2,和后缀p6p7
由于上面失配了,所以m=next[8]=2,所以我们前缀为p1p2,后缀为p7p8
注意:有可能模式串只有一个字符进行匹配,那么我们之前说的next[2]=1也需要我们去匹配一遍,而不是直接获取结果
//通过计算返回子串T的next数组 void get_next(String T, int* next) { int m, j; j = 1; //j是后缀的末尾下标 pj-m...pj-1 其实j-1就是后缀的下标,而j就是我们要求的next数组下标 m = 0; //m代表的是前缀结束时的下标 p1p2...pm next[1] = 0; while (j < T[0]) //T[0]是表示串T的长度 {
//这个if,我们只需要考虑,如果我<后缀最后下标>前面匹配成功,现在我T[j]==T[m]也匹配成功,那么我对应的next<++j>数组值是多少? if (m == 0 || T[m] == T[j]) //T[m]表示前缀的最末尾字符,T[j]是后缀的最末尾字符 { ++m; ++j; next[j] = m; //++j后获取的才是我们要的next[j]下标 } else //else是匹配失败的情况,就要进行回溯 m = next[m]; //若是字符不相同,则m回溯 } }
int main() { int i; String s1; int next[MAXSIZE] = { 0 }; char *str = (char*)malloc(sizeof(char) * 40); memset(str, 0, 40); printf("enter s1:"); scanf("%s", str); if (!StrAssign(s1, str)) printf("1.string length is gt %d\n", MAXSIZE); else printf("1.string StrAssign success\n"); get_next(s1, next); for (i = 1; i <= StringLength(s1); i++) printf("%d ", next[i]); system("pause"); return 0; }
标签:turn 测试结果 style 前缀 代码 ssi string http 匹配
原文地址:https://www.cnblogs.com/ssyfj/p/9456683.html