#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 來,而所有字串都構造自乙個有限集的字母表 其大小為 根 據先給出模式還是先給出文字,字串匹配分為兩類方法 ...