字符串匹配算法中最先学的算法是暴力算法,紧接着是KMP算法,到现在依旧没有理解next到底是怎么求的
寻找到了一种新的算法——Sunday算法,比KMP算法更快
匹配时关注匹配主串中参与匹配的最后一位字符的下一位字符。
#include<iostream>
#include<string>
using namespace std;
int sunday(string part,string total){
int psize=part.size(); //模式串的长度
int tsize=total.size(); //主串的长度
int move[126]; //长度为ASCII码的长度,记录如果匹配到这个字符的话要移动多少位
for(int i=0;i<126;i++){ //对于未出现在模式串中的字符,直接跳过全部,移动长度为模式串长度+1
move[i]=psize+1;
}
for(int i=0;i<psize;i++){ //对于出现在模式串中的字符,移动的长度对应模式串中最后一次出现此字符的情况
move[part[i]]=psize-i;
}
int s=0; //s为模式串匹配主串时首字符在主串中的位置
int j; //j为模式串已经匹配主串的长度
while(s<tsize-psize){ //防止越界
j=0; //重新开始匹配
while(part[j]==total[s+j]){ //如果匹配成功
j++; //继续匹配下一个字符
if(j>=psize) return s; //匹配结束的话返回模式串在主串中的位置
}
//跳跃
//s+psize 模式串匹配的下一个字符的位置
//total[s+psize] 下一个字符的值
//move[total[s+psize]] 需要移动的距离
s+=move[total[s+psize]]; //匹配失败则关注之后的字符
}
return -1;
}
int main(){
string a="dasc";
string b="asbdascddd";
cout<<sunday(a,b);
}