以前被KMP的next數組搞的頭昏腦脹說不上也是比較煩人的,今天看到還有這麼有趣並且高效的算法(比KMP還快),看來有必要作一點筆記了算法
Sunday算法是Daniel M.Sunday於1990年提出的字符串模式匹配算法,其簡單、快速的特色很是好!數組
其核心思想是:在匹配過程當中,模式串發現不匹配時,算法能跳過儘量多的字符以進行下一步的匹配,從而提升了匹配效率;能夠預見到,「跳過多個數」這個邏輯又能夠寫一個方法,而後被主函數調用curl
若是該字符沒有在匹配串中出現則直接跳過,即移動步長= 匹配串長度+1;不然,同BM算法同樣其移動步長=匹配串中最右端的該字符到末尾的距離+1
每一次移動前決定移動步長的是模式串末尾的下一個位置對應的主串字符函數
//C語言 #include <stidio.h> #include <string.h> int getCurlA(char *tar, char ch, int curlA) { int *p = tar; int delta = 0; while(p && *p!=ch){ p++; delta + = 1; } return curlA - delta; } int SundaySearch(char *src, char *tar) { int srcLen = strlen(src); int tarLen = strlen(tar); int curlA = curlB = 0; while(src[curlA] == tar[curlB]){ if(curlB == tarLen-1){ return curlB - tarLen + 1; }else{ curlA = getCurlB(&tar, src[curlA], curlB+1); } curlA++; } return -1; }