一.暴力匹配(时间复杂度n*m) 2个字符串长度相乘
int bruteForce(char *str, char *pat)
{
int i,j;
for(i = 0,j = 0; ; i++,j = 0){
while(str[i] == pat[j]){
i++,j++;
if(!pat[j])
return i-strlen(pat); //一定要子串在前判断,不然如果是最后刚好匹配,最后都为NULL的情况,会返回错误。
if(!str[i])
return -1; //返回-1说明不是其子串。
}
if(!str[i])
return -1;
}
}
二.先检测末端标记的模式匹配方法(时间复杂度n*m,但是平均处理时间减少了)
int nfind(char *str, char *pat)
{
int i,j,start = 0;
int lasts = strlen(str)-1,
lastp = strlen(pat)-1,
endMatch = lastp;
for(i = 0; endMatch <= lasts; start++,endMatch++){
if(str[endMatch] == pat[lastp])
for(j = 0,i = start; j < lastp && str[i] == pat[j]; j++,i++);
if(lastp == j)
return start;
}
return -1;
}
三.传说中的KMP算法。(待续)