数据结构 Sunday算法

本文深入解析了一种改进的字符串匹配算法,通过从模式串的末尾开始比较,结合模式串中字符位置信息进行高效跳转,实现了快速定位文本中模式串出现的位置。此算法在失配时能有效减少不必要的比较,提高了搜索效率。
int Sunday(const char*p1, const char* p2)
{
 int len1 = strlen(p1), len2 = strlen(p2);
 int i = len2-1, j = len2 - 1;
 while (i<len1&&j>=0)
 {
  if (p1[i] == p2[j])
  {
   i--;
   j--;
  }
  else
  {
   i++;
   int flag = 0;
   for (int k = 0; k < len2; k++)
    if (p2[k] == p1[i])
    {
     j = k;
     flag = 1;
     break;
    }
   if (flag == 0)
    i += len2;
   else
    i += len2 - j-1;
   j = len2-1;
  }
 }
 if (j < 0)
  return ++i;
 else
  return -1;
}

思路:
将文本串和模式串头部对其,然后从模式串的最后一个字符开始比较,如果两字符相同,则i,j同时减一,若失配,则i++,关注此时文本中匹配的末位字符的后一个字符,如果这个字符在模式串中出现则将模式串中左边第一个出现该字符的位置移动到与文本串中失配字符后一个字符对齐的位置,再将j移动到尾部,同时i也移动与j对齐,向前移动比较,直到j<0,此时i+1即为文本串中第一个出现字串的位置,或者当i>=len1,此时文本串中没有出现模式串,返回-1.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值