字串的模式匹配

2021-06-18 02:05:18 字數 1277 閱讀 6250

1、*****的模式匹配

int *****index(char * sstr,char * tstr)

int i=0,j=0;

while(iif(sstr[i]==tstr[j])

i++;

j++;

else

i=i-j+1;                  //指標回溯

j=0;

if(j==strlen(tstr))

return i-j;

else

return -1;

此方法最鮮明的特點就是指標回溯,時間複雜度為o(n*m)。

2、kmp演算法

kmp演算法中主串指標無須回溯,這是通過分析模式串中所蘊含的資訊實現的。

從i=0,j=0看是,判斷sstr[i]==tstr[j]是否相等

若相等,i++,j++,一直向下匹配;

若不相等,j=next[j],再重新判斷sstr[i]==tstr[j]是否相等,直至匹配成功或主串遍歷完畢

這裡的next[j]就是根據模式串中蘊含的資訊建立的陣列。可以這樣理解:在模式串位置j處之前的next[j]個字元與模式串開始的next[j]個字元是匹配的,但不是重疊的。

即模式串中索引值為0~next[j]-1之間的字元與主串中索引值為i-next[j]+1~i之間的字元是匹配的,接下來就要判斷sstr[i]==tstr[j]是否相等(j=next[j])。

//next陣列值的求解

void getnext(char *tstr,int next)

next[0]=-1;

int i=0,j=-1;

while(iif(j==-1||tstr[i]==tstr[j])

i++;

j++;

next[i]=j;

else

j=next[j];

//kmpindex函式

int kmpindex(char * sstr,char * tstr)

int i=0,j=0;

int lens=strlen(sstr);

int lent=strlen(tstr);

while(iif(j==-1||sstr[i]==sstr[j])

i++;

j++;

else

j=next[j];

if(j==lens-1)

return i-j;

else

return -1;

主串中每個字元只與模式串中的乙個字元比較,因此時間複雜度為o(m+n)。

字串模式匹配

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

字串模式匹配

子串的定位操作通常稱作串的模式匹配,是各種串處理系統中最重要的操作之一。設有2 個串 主串 s和子串 t,串的簡單模式匹配演算法是 從主串 s 中的第乙個字元開始和子串 t中的第乙個字元比較,分別用i和 j 指示s串和 t串中正在比較的字元的位置。若相等,則繼續逐個比較後續字元 否則從主串 s的第二...

字串模式匹配

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