演算法 字串匹配 BF KMP 近似匹配

2021-06-14 10:31:08 字數 1812 閱讀 2186

#include#includeusing namespace std;

#define maxstr 100

//----------------bf---------------- 時間o(n*m)

int stringmatch_bf(char *str, char *pat) //o(m*n) m=|str| , n=|pat|

else

if(pat[j]=='\0') //找到匹配位置

return irec;

if(str[i]=='\0') //沒有匹配位置

return -1;

}

}//----------------bf----------------

//------------kmp-------------預處理子串,得到next陣列,表示子串中的某個位置在跟主串不匹配時,應該繼續跟主串匹配的下乙個位置。

//時間o(n+m)攤還分析

void nextinit(int next, char* pat)

else }

for(pos=1;pat[pos]!='\0';pos++) //改進next陣列

if(pat[pos]==pat[next[pos]])//這種情況下可以直接重新開了

next[pos]=0; //如主串cbdcbc和cbdcbd不匹配時,要拿子串的開頭c和主串的結尾c比較

}int stringmatch_kmp(char *str, char *pat)

else

} else

if(pat[j]=='\0')

return irec;

else

return -1;

}//---------------kmp----------------------

//---------------其他匹配演算法待補充,如字尾陣列,自動機等----------------------

//------------字串近似匹配-------------

int stringnearmatch(char *str, char*pat,int k,int &begin)

else

if(editdis[i][j]>editdis[i][j+1])

else

else

}//下面是找到第乙個匹配模式串的地方,並返回末尾位置 ,begin返回初始位置

if(editdis[0][j]<=k)

for(i=0;str[i]!='\0';i++)

if(editdis[i+1][j]<=k)

break;

if(str[i]=='\0') //找不到近似匹配的子串

return -2;

int tail=i;

i++;

while(i>0&&j>0&&editdis[i][j]!=0)

switch(rec[i][j])

while(j!=0)

begin=i>=0?i:-1;//-1表明要在的前面加字串才可

return tail;

}//------------字串近似匹配-----------------

int main(){

loop:

char str1[maxstr],str2[maxstr];

cin>>str1>>str2;

//cout<>k;

int tail=stringnearmatch(str1,str2,k,begin);

if(tail==-2){

cout<<"not find"<

NGram近似字串匹配

介紹ngram是來自給定序列的n個單位的子串行。這些單位可以是單詞,字元等。例如,短語 hello world 的2 gram或bigram是 he el ll lo o w wo or rl 和 ld 用途ngram建模通常用於對自然語言進行建模。它還可用於 序列中的下乙個專案。ie,給定具有發生...

字串匹配演算法 字串匹配演算法總覽

字串匹配在文字處理裡非常重要,我們採用簡潔的python 把以下演算法一一實現並講解。樸素演算法 algorithm rabin karp 演算法 有限自動機演算法 finite automation knuth morris pratt 演算法 kmp algorithm boyer moore ...

字串匹配演算法

首先引用一下另一篇文章中對字串匹配的介紹 字串匹配指的是從文字中找出給定字串 稱為模式 的乙個或所有出現的位置。本文的演算法一律輸出全部的匹配位 置。模式串在 中用x m 來表示,文字用y n 來,而所有字串都構造自乙個有限集的字母表 其大小為 根 據先給出模式還是先給出文字,字串匹配分為兩類方法 ...