KMP演算法 next nextal修正

2021-08-01 18:53:15 字數 2039 閱讀 2738

標頭檔案的定義

#define maxsize 100 //最多的字元個數

typedef

struct

sqstring;

void strassign(sqstring &s,char cstr);

void strcopy(sqstring &s,sqstring t);

bool strequal(sqstring s,sqstring t);

int strlength(sqstring s);

sqstring concat(sqstring s,sqstring t);

sqstring substr(sqstring s,int i,int j);

sqstring insstr(sqstring s1,int i,sqstring s2);

sqstring delstr(sqstring s,int i,int j);

sqstring repstr(sqstring s,int i,int j,sqstring t);

void dispstr(sqstring s);

int index(sqstring s,sqstring t); //簡單匹配演算法

void getnext(sqstring t,int next); //由模式串t求出next值

int kmpindex(sqstring s,sqstring t); //kmp演算法

void getnextval(sqstring t,int nextval); //由模式串t求出nextval值

int kmpindex1(sqstring s,sqstring t); //修正的kmp演算法

void strassign(sqstring &s,char cstr) //s為引用型引數

void strcopy(sqstring &s,sqstring t) //s為引用型引數

{ int i;

for (i=0;i

int main(int argc, char* argv)

{

int j;

int next[maxsize],nextval[maxsize];

sqstring s,t;

strassign(s,"abcabcdabcdeabcdefabcdefg");

strassign(t,"abcdeabcdefab");

printf("串s:");dispstr(s);

printf("串t:");dispstr(t);

printf("簡單匹配演算法:\n");

printf(" t在s中的位置=%d\n",index(s,t));

getnext(t,next); //由模式串t求出next值

getnextval(t,nextval); //由模式串t求出nextval值

printf(" j ");

for (j=0;jprintf("%4d",j);

printf("\n");

printf(" t[j] ");

for (j=0;jprintf("%4c",t.data[j]);

printf("\n");

printf(" next ");

for (j=0;jprintf("%4d",next[j]);

printf("\n");

printf(" nextval");

for (j=0;jprintf("%4d",nextval[j]);

printf("\n");

printf("kmp演算法:\n");

printf(" t在s中的位置=%d\n",kmpindex(s,t));

printf("改進的kmp演算法:\n");

printf(" t在s中的位置=%d\n",kmpindex1(s,t));

return 0;

演算法 KMP演算法

kmp演算法主要解決的問題就是在字串 主串 中的模式 pattern 定位問題。記主串為t,模式串為p,則kmp演算法就是返回p在t 現的具體位置,如果沒有出現則返回 1。如果 i 指標指向的字元和 j 指標指向的字元不一致,那麼把 i 右移1位,j 從0位開始,從新開始匹配 如果 i 指標指向的字...

kmp演算法next例題 KMP演算法next陣列求解

kmp演算法與bf演算法的比較 bf演算法的想法十分樸素,即先將子串t的第一位與主串s的第一位對齊開始匹配,當不能匹配時將子串整體往後移一位,然後重新匹配,以此類推直至排出結果 如當遇到下圖所示情況時,需將子串整體後移一位,將i,j分別回溯到主串第2位和子串第一位。kmp演算法 對bf進行思考後,我...

KMP及KMP改進演算法

kmp 看毛片 演算法確實很難理解,上網搜了半天想了很久才大概想明白。kmp演算法精華在於next陣列 部分匹配值 即next陣列就是 字首 和 字尾 的最長的共有元素的長度。以 abcdabd 為例,a 的字首和字尾都為空集,共有元素的長度為0 ab 的字首為 a 字尾為 b 共有元素的長度為0 ...