字符串的匹配(KMP和sunday算法详解)

本文介绍了KMP和SUNDAY两种字符串匹配算法,重点解析了KMP算法的next数组求解及其匹配过程,以及SUNDAY算法的基本思路和操作步骤。通过理解这两种算法,可以提升字符串处理的效率。
摘要由CSDN通过智能技术生成

之前一直用的kmp来做字符串的匹配题目,直到今日才知道还有sunday这种高效又简单的算法,虽然不能百分之一万的保证准确性,我也没有看sunday算法的相关证明,不过学习了之后确实觉得巧妙,今天我就好好写写这两种算法。

第一 经典的kmp:

kmp的核心就是求next数组,而求next数组,主要就是以下几步:
每一个next[i]的值都代表着i前面的字符的最大回文长度。因此,我们设next[0]=-1,因为位置0前面没有字符,然后设next[1]=0,因为1前面只有0一个字符·,所以为零。

然后我们将一个计数器记零,这是当前最大kmp匹配长度+1,将要求的next的位置指针指向2,然后一路往下,

匹配的规则就是:看当前位置的字符与计数器所在的字符是否相等,因为之前的是最长字符串,已经匹配完了,都相等,如果这个字符也相等,那么当前位置的next值就是上一个next加一。如果不相等,就要把计数器跳到最长字符串的尾端的位置的next,找到最长字符串里面的最长回文字符串,看看是不是相等,直到相等加一,或者计数器跳至负一,游戏结束,将next置零。

现在看实现:

void getnext(vector<int> &next,string str){
   next[0]=-1;
   next[1]=0;
   int pos=2;
   int kmp=0;
   while(pos<str.size()){
      if(str[pos-1]=&#
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值