怎么求串的模式值next[n]
(1)next[0]= -1 意义:任何串的第一个字符的模式值规定为-1。
(2)next[j]= -1 意义:模式串T中下标为j的字符,如果与首字符
相同,且j的前面的1—k个字符与开头的1—k
个字符不等(或者相等但T[k]==T[j])(1≤k<j)。
如:T=”abCabCad” 则 next[6]=-1,因T[3]=T[6]
(3)next[j]=k 意义:模式串T中下标为j的字符,如果j的前面k个
字符与开头的k个字符相等,且T[j] != T[k] (1≤k<j)。
即T[0]T[1]T[2]。。。T[k-1]==T[j-k]T[j-k+1]T[j-k+2]…T[j-1]
且T[j] != T[k].(1≤k<j);
(4) next[j]=0 意义:除(1)(2)(3)的其他情况。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82#include <iostream.h> //#include <string.h> void get_nextval(const char *T, int next[] ) { // 求模式串T的next函数值并存入数组 next。 int j = 0, k = -1; next[0] = -1; while ( T[j] != '' ) { if (k == -1 || T[j] == T[k]) { ++j; ++k; if (T[j]!=T[k]) next[j] = k; else next[j] = next[k]; } else k = next[k]; } // 这里是我加的显示部分 for(int i=0;i<j;i++) { cout<<next[i]<<endl; } cout<<endl; } /// int KMP(const char *Text,const char* Pattern) { if( !Text||!Pattern|| Pattern[0]=='' || Text[0]=='' ) return -1;//空指针或空串,返回-1。 int len=0; const char * c=Pattern; while(*c++!='') { ++len; } int *next=new int[len+1]; get_nextval(Pattern,next);//求Pattern的next函数值 int index=0,i=0,j=0; while(Text[i]!='' && Pattern[j]!='' ) { if(Text[i]== Pattern[j]) { ++i; ++j; } else { index += j-next[j]; if(next[j]!=-1) j=next[j];// 模式串向右移动 else { j=0; ++i; } } } delete []next; if(Pattern[j]=='') return index;// 匹配成功 else return -1; } int main() { char* text="babadCadCaaaaa"; char*pattern="adCad"; cout<<KMP(text,pattern)<<endl; return 0; }
最后
以上就是洁净抽屉最近收集整理的关于KMP算法(详细求串的next[n])的全部内容,更多相关KMP算法(详细求串内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复