串的模式匹配,即子串在主串中的定位操作;
5.1.简单模式匹配——B-F算法:
1.基本思想:从主串S的第一个字符s0和子串T的第一个字符t0开始比较,并分别用指针i和j指示当前位置,若相等,则继续比较两串的当前位置的后继字符,若不相等,则从主串的第二个字符开始,和子串的第一个字符比较,即若相等,i++;j++;若不想等,i=i-j+1;j=0;
2.算法实现:
#include <stdio.h>
#include <string.h>
#define MAXSIZE 20
typedef struct snode{
char data[MAXSIZE];
struct snode *next;
}LinkStr;
int strIndex_BF(char S[],char T[]);
int main(int argc, char *argv[])
{
char S[]="abcdabdcbdabc";
char T[]="abdc";
int result = strIndex_BF(S,T);
printf("result=%d\n",result);
return 0;
}
int strIndex_BF(char S[],char T[]){
int i=0;
int j=0;
while(i<strlen(S)&&j<strlen(T)){
if(S[i]==T[j]){
i++;
j++;
}else{
i=i-j+1;
j=0;
}
}
if(j<=strlen(T)){
return i-strlen(T);
} else{
return -1;//匹配失败
}
}
5.2.KMP算法:
5.2.1.基本概念:
1.KMP算法主要是消除了B-F算法的回溯问题,极大地提高了匹配效率;
2.基本思想:假设S为主串,T为子串,并且i和j分别表示指向S和T的元素的指针,令i和j的初始值为0,若
Si=
Tj,则比较下一个字符,即i和j加1;若
Si!=
Tj,则i不变,将j回退到next[j]的位置(下面会提到,别着急),即j=next[j],依次类推,直到比较完成。在比较的过程中有两个规则:
①若
S
i=Tj,i++;j++;
②若j回退到了0的位置,此时规定next[0]=-1,此时Si+1和T0
比较;
5.2.2.next[]的计算:
1
.next[]值的计算&#x