记一次Sunday算法的实现,相较与KMP算法而言Sunday算法更加容易理解和实现(听说查找速度也更快)
#include <stdio.h>
#include <string.h>
int sunday(char *str1,char *str2,int len1,int len2){
int shift[254] = {0};
//默认全部初始化为 len2 - 1
for(int i = 0;i < len2 ; ++i){
shift[i] = len2 + 1;
}
//设置具体发生失败时具体偏移多少次
for(int i = 0;i < len2 ; ++i){
shift[str2[i]] = len2 - i;
}
// s记录每次匹配时的起始位置
// j记录匹配了多少个
int j = 0,s = 0;
//从有效位置开始
while(s <= len1-len2){
j = 0; //刚开始匹配和匹配失败时j设置为0,即匹配到了多少个
while(str2[j] == str1[j + s]){
++j;
if(j >= len2)
return s;
}
//匹配失败
s += shift[str1[s + len2]];
}
//全部匹配失败
return -1;
}
int main(){
char str1[1005] = {0};
char str2[1005] = {0};
scanf("%[^\n]%*c",str1);
scanf("%[^\n]%*c",str2);
int len1 = strlen(str1);
int len2 = strlen(str2);
int pos = sunday(str1,str2,len1,len2);
printf("%d\n",pos > 0 ? pos+1 : pos);
return 0;
}