kmp算法的时间复杂度是O(m+n)
//get next value
void get_next_val(char *s,int *next) {
int len=strlen(s);
int j=0,k=-1;
next[0]=-1;
while(j<len-1) {
if(k==-1 || s[j]==s[k]) {
++j; ++k;
if(s[j]!=s[k]) next[j]=k;
else next[j]=next[k];
} else {
k=next[k];
}
}
}
//kmp match
int kmp_match(char *str1,char *str2,int *next) {
get_next_val(str2,next);
int len1=strlen(str1);
int len2=strlen(str2);
int i=0,j=0;
while(i<len1 && j<len2) {
if(j==-1 || str1[i]==str2[j]) {
++i; ++j;
} else {
j=next[j];
}
}
if(j>=len2) return i-len2;
else return -1;
}
朴素算法的时间复杂度是O(mn),每次检测到不匹配都要回溯,效率较低,但是基础。
int brute_match(char*str1,char*str2) {
int m=strlen(str1),n=strlen(str2);
int i=0,j=0;
while(i<m && j<n) {
if(str1[i]==str2[j]) {
i++; j++;
} else {
i=i-j+1; j=0;
}
}
if(j==n) return i-j+1;
else return -1;
}