這道題當(dāng)初我想著直接抄課本上的BF代碼,結(jié)果發(fā)現(xiàn)書中的代碼都是默認(rèn)模式串和主串的下標(biāo)從零開始,因此需要將書中的代碼進(jìn)行修改。如下圖所示,需要將變量i,j的初值都設(shè)為0。然后將書中出現(xiàn)的i,j全部加1即可。然后這個(gè)函數(shù)中的第三個(gè)參數(shù),pos的值我沒有使用,這個(gè)無所謂,因?yàn)檫@道題的模式匹配都是從主串的第一個(gè)位置開始。
第一個(gè)函數(shù)的代碼如下:
int Index_BF(HString P,HString V,int pos)
{//返回模式T在主串S中第pos個(gè)字符開始第一次出現(xiàn)的位置。若不存在,則返回值為0
//其中,T非空,1≤pos≤StrLength(S)
V.length=strlen(V.ch);
int i=0,j=0;
while(i+1<=P.length&&j+1<=V.length)
{
if(P.ch[i]==V.ch[j])
{
++i;
++j;
}
else
{
i=i-j+1;
j=0;
}
}
if(j+1>V.length)
{
return i-V.length+1;
}
else
return 0;
}
第二個(gè)函數(shù)的算法沒有什么可說的,就按照一般的環(huán)形字符串解決方法,再開一個(gè)兩倍長(zhǎng)度的數(shù)組,將模式串存儲(chǔ)兩次,再依次取字符串即可。代碼如下:
bool Virus_detection(HString Virus,HString Person)
{//判斷是否匹配,如果可以,返回true,否則返回false
//模式匹配算法調(diào)用Index_BF函數(shù)
int flag=0;
HString temp;
temp.ch=new char[200];
int m=Virus.length;
for(int i=m,j=0;j<m;j++)
{
Virus.ch[i++]=Virus.ch[j];
}
Virus.ch[2*m]='\0';
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++){
temp.ch[j]=Virus.ch[i+j];
}
temp.ch[m]='\0';
flag=Index_BF(Person,temp,1);
if(flag) break;
}
delete temp.ch;
if(flag)
return true;
else
return false;
}
這道題當(dāng)初我出現(xiàn)的問題是只定義了一個(gè)HString類型的temp,卻沒有為他分配空間,導(dǎo)致后面出現(xiàn)了內(nèi)存泄露的問題。文章來源:http://www.zghlxwxcb.cn/news/detail-740945.html
希望能幫助到大家。文章來源地址http://www.zghlxwxcb.cn/news/detail-740945.html
到了這里,關(guān)于BFU數(shù)據(jù)結(jié)構(gòu)頭歌實(shí)驗(yàn):基于BF算法的病毒感染檢測(cè)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!