字串模式匹配

2021-04-01 09:55:10 字數 2440 閱讀 3750

子串的定位操作通常稱作串的模式匹配,是各種串處理系統中最重要的操作之一。設有2

個串:主串

s和子串

t,串的簡單模式匹配演算法是:從主串

s 中的第乙個字元開始和子串

t中的第乙個字元比較,分別用i和

j 指示s串和

t串中正在比較的字元的位置。若相等,則繼續逐個比較後續字元;否則從主串

s的第二個字元開始再重新與子串的第乙個字元進行比較。依次類推,直到子串

t中的每個字元依次和主串

s中的乙個連續字串行相等,則匹配成功,返回子串

t中第乙個字元在主串

s中的位置。

主串和子串均採用鏈式儲存結構,在單鏈表建立過程中都採用後插法。

p指標為主串的頭指標,

t指標為子串的頭指標,s和

k分別為主串和子串的中間指標,始終指向新建立的結點。

參考程式:

#include

#define null0

typedef struct node

slnode;

slnode *p,*t,*s,*k,*first;

void initiate(slnode **h)

main()

x=0;

initiate(&t);

k=t;

printf("input sub-string: ");

while(x!='/n')

s=t->next;

i=1;

s=p->next;

first=s;

k=t->next;

while((s!=null)&&(k!=null))

if(s->ch==k->ch)

else

if(k==null)

printf("/nmatch postion:%d",i);

else

printf("/nthe two strings are not matched!");

printf("/n");}

簡單模式匹配演算法因為有回溯所以速度慢,還有一種改進演算法,消除了回溯所以加快了匹配速度。這種改進演算法是

d.e.knuth

與v.r.prett

和j.h.morris

同時發現的,因此人們稱之為克努特

-莫里斯

-普拉特操作(簡稱

kmp演算法)。此演算法可以在

o(n+m)

的時間數量級上完成串的模式匹配操作。改進之處在於:當每一趟匹配過程中出現字元比較不相等時,不回溯

i指標,而是利用已經得到的「部分匹配」的結果將子串向右「滑動」盡可能遠的一端距離後,繼續進行比較。

具體例項,若

si 與

tj不相同,但是主串中從

i-j+1

到i-1

下標的字元與子串中從1到

j下標的字元一一對應。此時應確定子串右移的位數,然後與主串相應位進行比較。不妨把與

si進行比較的子串字元記作

tk(k。

kunth

等人發現這個

k值僅僅依賴於子串的前

j個字元,而與主串無關。用

next[j]

表示與j

對應的k

值,則表明子串第

j個字元與主串相應位失配時(si≠

tj),可以用子串中以

next[j]

為下標的字元與主串中

si進行比較。若

next[j]=0

,表明子串中任何字元都不與主串中的

si進行比較,主串中下乙個字元

si+1與t1

進行比較。

next[j]

函式的定義如下:

0j=1

next[j]=max

}printf("/ninput the substring: ");

x=0;

while(x!='/n')

}j=1;//

求子串的

next

函式值,並存入陣列

next。

k=0;

next[1]=0;

while(j

if((k==0)||(t[j]==t[k]))

else

k=next[k];

printf("/nout put array next:");

for(i=1;i<=t1;i++)

printf("%d",next[i]);

i=1;

j=1;

while((i<=s1)&&(j<=t1))

if((j==0)||(s[i]==t[j]))

else

j=next[j];

//子串向右移動

if(j>t1)

else

printf("/nthe two strings are not matched!/n");}

字串模式匹配

include include include include include includeusing namespace std inline unsigned int64 getclock const char min a const int characters 26 int shiftta...

字串模式匹配

bf演算法 我們常用的暴力演算法,時間複雜度o n2 o n 2 演示 int bf const char text,const char pattern if flag return 1 return 0 kmp演算法 基於bf演算法的優化,他根據字串出現字首與字尾相同的情況進行優化 假設這裡sa...

字串模式匹配

2019 11 30 字串模式匹配 若兩個串長度相等且每個對應位置的字元都相等時,稱這兩個串 是相等的。1 define maxlen 255 2 typedef struct sstring 2 堆分配儲存表示 1 typedef struct 上面五個操作稱為最小操作子集 index s,t,p...