Sunday算法(字符串匹配-)
In abcde cde
Out The index is: 2
#include<bits/stdc++.h>
using namespace std;
void SundayMatch(const char *src, const char *patt){//传入源串(长)与模板串(短)
int slen = strlen(src);//得源串长
int plen = strlen(patt);//得模板串长
int shift[256];//位移标记
for(int i=0;i<256;++i)shift[i]=plen+1;//初始化全部都是模板串长+1,对于一些模板串中没有的字符就是偏移整个plen
for(int i=0;i<plen;++i)shift[(unsigned char)(patt[i])]=plen-i;//当前字符串距离最右端的距离
//遍历模板串的每一位,记录他到串末的步距,由于是左扫到右,可以保证每个字符是后出现的那个到最右端距离
int limit=slen-plen;//最后至少还剩下patt长度的未匹配字符段
for(int i=0;i<=limit;i+=shift[src[i+plen]]){//i是母串当前扫到的左界
int j=0;
while(j<plen){//然后以I为左界逐位判
if(src[i+j]!=patt[j])break;//如果不等就跳出,每次跳出后,左界i各移shift[src[i+plen]],即母串中i+plen的那个字符到模板串末步长
j++;//一直相同就不断加
}
if (j==plen)cout<<"The index is: " << i << endl;//万一匹配到相等退出表示找到,就读出此时左界即可
}
}
int main(){
char s[1003],p[1003];
cin>>s>>p;
SundayMatch(s,p);
return 0;
}
/*
补充:基础是KMP,比KMP快的是BM(BM比KMP快3~5倍,还有文本处理软件中的查找(CTRL+F)和替换(CTRL+H)命令用的就是BM算法),比BM快的是Sunday,为此篇文章
*/