子串的定位操作通常稱作串的模式匹配,是各種串處理系統中最重要的操作之一。設有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...