比KMP更容易理解的sunday算法,O(m+n),不用计算next数组,比KMP更快。
A = "LESSONS TEARNED IN SOFTWARE TE";
B = "SOFTWARE";
先从左到右逐个字符比较,以我们的字符串为例:
开始的时候,我们让i = 0, 指向A的第一个字符; j = 0 指向B的第一个字符,分别为"L"和"S",不等;这个时候,Sunday算法要求,找到位于A字串中位于B字符串后面的第一个字符,即T。
从后向前遍历B串,找到相等的字母。将B串移至使T对齐的地方,如第二步。继续从B的开头比较,重复第一步和第二步,直至找到,或者A遍历结束。如果A字符串后位于B字符串后面的第一个字符T在B中没有对应的字符,就将整个B串与T之后的字符对齐。
第一步:
LESSONS TEARNED IN SOFTWARE TE
SOFTWARE
第二步:
LESSONS TEARNED IN SOFTWARE TE
SOFTWARE
int
sunday(
char
*w,
char
*t)
{
if
(strlen(t)>strlen(w))
return
-1;
int
i1,i2;
int
prei;
int
i,j;
int
index;
i1 = 0;
i2 = 0;
index = -1;
while
(i1<strlen(w)){
prei = i1;
for
(i2 = 0;i2<strlen(t)&&i1<strlen(w);++i2,++i1)
if
(w[i1] != t[i2])
break
;
if
(i2 == strlen(t)){
index = prei;
break
;
}
i = prei + strlen(t);
if
(i == strlen(w))
break
;
for
(j=strlen(t)-1;j>=0;--j)
if
(t[j] == w[i])
break
;
if
(j >= 0)
i1 = i-j;
else
i1 = i+1;
}
return
index;
}