.

之前被KMP的next陣列搞的頭昏腦脹說不上也是比較煩人的,今天看到還有這麼有趣而且高效的演算法(比KMP還快),看來有必要做一點筆記了

Sunday演算法是Daniel M.Sunday於1990年提出的字串模式匹配演算法,其簡單、快速的特點非常好!

思路

其核心思想是:在匹配過程中,模式串發現不匹配時,演算法能跳過儘可能多的字元以進行下一步的匹配,從而提高了匹配效率;可以預見到,“跳過多個數”這個邏輯又可以寫一個方法,然後被主函式呼叫

如果該字元沒有在匹配串中出現則直接跳過,即移動步長= 匹配串長度+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++;
    }
    r