1、KMP模式匹配算法的實現算法
// 返回字串T在主串S第pos個字符以後的位置 // 若不存在,則返回0 int Index_KMP(String S, String T, int pos){ int i = pos; int j = 1; int next[255]; get_next(T, next); while(i <= S[0] && j <= T[0]){ if(0 == j || S[i] == T[j]){ i++; j++; }else{ j = next[j]; } } if(j > T[0]){ return i - T[0]; }else{ return 0; } }
2、KMP模式匹配算法的改進與優化數組
有人發現上面的KMP算法,實際上是由缺陷的。好比咱們的主串 S = "aaaabcde",字串 T = "aaaaax",其中很容易獲得next數組爲012345。優化
如圖所示,咱們能夠看到,字串 T 在第5個位置就失配了:code
若是按照上述代碼實現的KMP算法的話,在子串 T 在第5個位置失配時,T開始尋找它的next,即從4開始回溯匹配,直到0,開始位置,發現都不匹配,那麼此時主串 S 和子串 T都往前移動一個位置,即主串 S 到了第6個元素的位置,子串 S 也從位置0到了位置1,以下圖所示:blog
咱們就會發現儘管這是按照KMP算法的思路進行匹配的,可是效率仍然不高,由於子串 T 的前5個都是相同的,因此回溯匹配(4,3,2,1與5相等,若是匹配確定也是失配的!)時就會致使效率低下,因此,咱們有必要進行改進,咱們能夠判斷失配位置對應next數組中值的對應的位置的值是否相等(即判斷位置5和位置4是否相等),即只要在next數組的計算過程當中,若是說它的下一個元素跟以前的前綴元素相等的話,它就須要直接回溯到它前綴元素的next的值那裏去,即回溯到它前綴元素next下標所指向的索引!代碼以下:索引
// 返回字串T在主串S第pos個字符以後的位置 // 若不存在,則返回0 int Index_KMP(String S, String T, int pos){ int i = pos; int j = 1; int next[255]; get_next(T, next); while(i <= S[0] && j <= T[0]){ if(0 == j || S[i] == T[j]){ i++; j++; // 改進優化代碼------- if(T[i] != T[j]){ next[i] = j; }else{ next[i] = next[j]; } // 改進優化代碼------- }else{ j = next[j]; } } if(j > T[0]){ return i - T[0]; }else{ return 0; } }
本文爲原創文章,若是對你有一點點的幫助,別忘了點贊哦!比心!如需轉載,請註明出處,謝謝!get