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...