參考:https://www.cnblogs.com/lufangtao/p/3245647.html
1.簡單模式匹配
從主串的第pos位置字符開始和模式子串字符比較,如果相等,則繼續逐個比較后續字符;否則從主串的下一個字符起再重新和模式子串的字符比較。直到找到匹配字符串或者是主串結尾。其中主串需要回溯到失配的位置的下一個位置,子串回溯到最開始位置。
例如,主串T為:ababcabababab,子串為ababa,上述過程如下圖所示。
參考代碼
/* 檢測從主串T的pos位置開始,是否有和子串S匹配,如果有返回匹配開始位置,如果沒有,返回-1 T:主串 S:子串 tlength:主串長度 slength:子串長度 pos:主串開始位置 */ int Index (char T[],char S[],int tlength,int slength,int pos) { int j=0,i=pos; while(i<tlength&&j<slength) { if(T[i]==S[j]) { i++; j++; } else { i=i-j+1; j=0; } } return j==slength?i-slength:-1; }
2.KMP算法
與簡單算法的區別,KMP的特點是主串不用回溯,只需回溯子串即可, 即只需給子串找到一個“合適的位置”接着進行匹配,而不用挪動主串。我們的任務就是確定這個“合適的位置",從而引出了next數組。我們用next[j]表示當模式子串中第j個字符與主串中相應的字符失配時,在模式串中需要重新和主串比較的字符位置。需要說明的是,求next數組時只與模式字串自身的結構有關系,與主串無關。
另next數組求法:https://blog.csdn.net/wenyun_kang/article/details/65436838
參考代碼

1 int KMP_Index(char T[],char S[],int tlength,int slength,int pos) 2 { 3 int *next=(int*)malloc(slength*sizeof(int)); 4 KMP_Next(S,next,slength); 5 6 int j=-1,i=pos-1; 7 while(i<tlength&&j<slength) 8 { 9 if(j==-1||T[i]==S[j]) 10 { 11 i++; 12 j++; 13 } 14 else 15 j=next[j]; 16 } 17 return j==slength?i-slength:-1; 18 19 20 }