我是靠谱客的博主 洁净抽屉,这篇文章主要介绍KMP算法(详细求串的next[n]),现在分享给大家,希望可以做个参考。

 怎么求串的模式值next[n]

 

1next[0]= -1  意义:任何串的第一个字符的模式值规定为-1


2next[j]= -1   意义:模式串T中下标为j的字符,如果与首字符

相同,且j的前面的1—k个字符与开头的1—k

个字符不等(或者相等但T[k]==T[j])(1k<j)。

如:T=”abCabCad”  next[6]=-1,因T[3]=T[6]


3next[j]=k    意义:模式串T中下标为j的字符,如果j的前面k

字符与开头的k个字符相等,且T[j] != T[k] 1k<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].1k<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算法(详细求串内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部