RK算法
直接使用的ascii码进行检测
s1是长字符串,p是匹配字符串查找s1中是否有p。
通过比较字符串的hash值来确定。
hash值相同,字符串必须要再次比较,预防hash冲突。
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string>
using namespace std;
int main(){
string s1="dsdfdfabddsad";
string p="acd";
int childlength=p.length();
//先计算子串的哈希值
int childhash=0;
for(int i = 0;i<childlength;i++){
childhash+=p[i];
}
cout<<"substr's hash:"<<childhash<<endl;
//遍历字符串,找是否存在哈希值相同的子串(与子串长度相同)
int parenthash=0;
//赋初值
for(int i=0;i<childlength;i++){
parenthash+=s1[i];
}
if(parenthash==childhash){
printf("True!!\n");
}else{
//遍历求解
int parentlen=s1.length();
for(int i = childlength ;i<parentlen;i++){
parenthash=parenthash-s1[i-childlength]+s1[i];
if(parenthash==childhash){
//注意此时并不一定包含,可能存在hash冲突 例如 abd acd
string tmp=s1.substr(i-childlength+1,childlength);
if(tmp==p){
printf("True\n");
break;
}else{
//子串哈希值相同,但子串不同
printf("False\n");
break;
}
}
}
if(parenthash!=childhash){
printf("False\n");
}
}
}