🤔简单暴力匹配算法
➡️定义
- 子串的定位操作
➡️算法思想
- 从
主串S
的第一个字符起,与模式T
的第一个字符比较,若相等,则继续逐个比较后续字符;否则从主串
的下一个字符起,重新和模式
的字符比较。
➡️代码
int Index(SString S,SString T){
int i=1,j=1;
while(i<=S.length && j<=T.length){
if(S.ch[i]==T.ch[j])(
++i;++j;
}
else{
i=i-j+2; j=1; //指针后退重新开始匹配
}
}
if(j>T.length) return i-T.length;
else return 0;
}
😊小主看到这里停留几分钟自己思考分析一下代码
➡️时间复杂度
- 最坏时间复杂度为O(mn),其中n和m分别为
主串
和模式串
的长度
🤔KMP算法
➡️next数组计算案例
上图的模式串中已求得6个字符的next值,现求next[7],因为next[6]=3,又p6!=p3,则需比较p6和p1(因next[3]=1),由于p6!=p1,而next[1]=0(注意这里是因为next[1]=0,才停止比较,否则继续用next[next[1]]继续比较下去),所以next[7]=1;求next[8],因p7=p1,next[8]=next[7]+1=2;next[9],因p8=p2,则next[9]=3。
😊小主稍加阅读三遍便能体会
➡️计算next数组代码
void get_next(String T,int next[]){
int i=l, j=0;
next[1]=0;
while(i<T.length){
if(j==0 || T.ch[i]==T.ch[j]){
++i; ++j;
next[i]=j; //若pi=pj,则next[j+1]=next[j]+1
}
else
j=next[j]; //否则令j=next[j],循环继续
}
}
➡️匹配算法代码
int Index KMp(String S,String T,int next[]){
int i=l, j=l;
while(i<=S.length&&j<=T.length){
if(j==0||s.ch[i]==T.ch[j]){
++i;++j; //继续比较后继字符
}
else
j=next[j]; //模式串向右移动
}
if(j>T.length)
return i-T.length; //匹配成功
else
return 0;
}
➡️时间复杂度
主串
中的i下标不会回溯,大大优化了算法,时间复杂度为O(m+n)