(半转载)Sunday算法(字符串完全匹配)

本文介绍了一种简单高效的字符串匹配算法——SUNDAY算法。该算法具有O(m+n)的时间复杂度,不需要预处理next数组,相较于KMP算法更为直观易懂。通过实例演示了算法的工作原理,并提供了实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

比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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值