模式串匹配,kmp

2022-01-31 13:28:22 字數 1326 閱讀 6581

#include #include 

#include

#include

#define maxstrlen 255 /* 可以在255以內定義最大串長 */typedef

char sstring[maxstrlen + 1]; /*

0號單元存放串的長度

*/void get_next(sstring t, int

next);

void get_nextval(sstring t, int

nextval);

int index(sstring s, sstring t, int

pos) //

繼續比較後繼字元

else //

指標後退重新開始匹配

}

if (j > t[0]) return i - t[0

];

else

return0;

}int index_kmp_1(sstring s, sstring t, int

pos) //

繼續比較後繼字元

else j = next[j]; //

模式串向右移動

}

free

(next);

if (j > t[0]) return i - t[0]; //

匹配成功

else

return0;

}void get_next(sstring t, int

next)

else j =next[j];

}}int index_kmp_2(sstring s, sstring t, int

pos) //

繼續比較後繼字元

else j = nextval[j]; //

模式串向右移動

}

free

(nextval);

if (j > t[0]) return i - t[0]; //

匹配成功

else

return0;

}void get_nextval(sstring t, int

nextval)

else j =nextval[j];

}}/*

樣例s:ababcabcacbab

t:abcac

*/int

main()

模式串匹配 KMP

樸素的的模式串匹配演算法通常要在向前移動文字指標之後,回溯模式串指標,其效率為o m n 而kmp演算法則挖掘了一些模式串中的一些資訊,來加快匹配的效率。kmp演算法的緊隨便是覆蓋函式next。當模式串p j 和文字串s i 失配時,j指標不是簡單的回溯,而是指向next j 覆蓋函式next如何定...

kmp模式串匹配

作用 字串匹配 我們設匹配串為t,待匹配串為s,這個演算法的功能就是在指定s中,從s的第i位字元開始搜尋,判斷在s中是否有t存在。如果有則返回出現了t的首位字元位置 當然,這個陣列是從0開始 如果沒有則返回0。通過next陣列對匹配串t進行乙個預處理,我們獲得乙個next陣列。下面的描述 strin...

KMP模式串匹配

查詢在乙個很長n的 文字串 中,給定的很短m的 模式串 的出現有無,次數,位置 複雜度o n m 而不是暴力的o n m 這裡對模式串做了乙個神奇的移位法則,注意kmp是只針對模式串的操作,不是文字串 我喜歡把kmp叫做 對應的前一項字首位置 例如 kmp記錄的是怎麼一回事,看圖看資料馬上就明白了 ...