串匹配算法之Sunday算法

sunday算法据说是效率比KMP,BM都好的算法

sunday算法的关注点与kmp算法不一样,sunday算法关注的是目标串

匹配则好,如果不匹配,则看下一位是否在模式串中(因为当前已经失配,那么下一位肯定是要参与匹配的)

如果下一位在模式串中有,则关于最右边的这位进行对齐(因为可能这个下一位在模式串中不止一个)

下面模拟一下算法

第一趟

acabaabaabcacaabc
abaabcac         
失配,看i的下一位是a,在模式串中有好几个,将最右边的一个与它对齐

第二趟

acabaabaabcacaabc
  abaabcac       

失配,看i的下一位是c,在模式串中有好几个,将最右边的一个与它对齐

第三趟

acabaabaabcacaabc
   abaabcac      

失配,看i的下一位是a,在模式串中有好几个,将最右边的一个与它对齐

第四趟

acabaabaabcacaabc
    aabaabcac    

 匹配成功

根据上面的匹配过程,可以写出下面的Sunday算法


public class Solution {
   public int strStr(String haystack, String needle) {
   
    int tab=0;
    int i=0,j=0;
    int countj=0;
    int counti=0;
    int k=0;
    while(i<haystack.length()&&j<needle.length()) {
    if(haystack.charAt(i)==needle.charAt(j)){
    i++;
    j++;
    counti++;
    countj++;
    } else {
   
    tab=i-counti+needle.length();
    k=j-countj+needle.length()-1;
    countj=0;
    counti=0;
    j=0;
    while(k>=j && tab<haystack.length()&&needle.charAt(k)!=haystack.charAt(tab) ) {
    k--;
    }
    if(k==-1) i=tab+1;
    else i=tab-(k-j);
   
   
    }
    }
    if(j==needle.length()) return tab-k;
    else return -1;
   }
}



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值