關於KMP演算法

2021-09-08 20:21:26 字數 1288 閱讀 7352

複習的時候隨便寫寫的,用git太麻煩,就用csdn儲存下。kmp演算法寫起來很短,但是精髓是它的思想不太好理解,主串不用回溯,是因為模式串自己與自己比較匹配可以得出相應的next值,然後模式串向右滑動,例如,模式串abcd***xxabci***x在第i位失配,只需要模式串滑到d與主串繼續比較。。。哎呀表達得不太好,書上這部分內容講了三大頁,畢竟是世界十大偉大演算法之一。

#include#includeusing namespace std;

int next[100] = ;

void getnext(string &s, int next)

else

j = next[j]; }}

int kmp(string s, string t, int pos)

else

} if (j > t.length()-1)

return i-t.length();

else

return-1;

}void main() while (choice != 2);

}

好吧,我覺得第一版寫得很水,下面第二版應該好很多

/***字串匹配演算法***/

#include#includeusing namespace std;

#define ok 1

#define error 0

#define overflow -2

typedef int status;

#define maxstrlen 255 //使用者可在255以內定義最長串長

typedef char sstring[maxstrlen+1]; //0號單元存放串的長度

status strassign(sstring t, char *chars)

}//計算next函式值

void get_next(sstring t, int next)

else

j = next[j];

}//get_next

//kmp演算法

int index_kmp(sstring s, sstring t, int pos, int next)

else

j = next[j]; // 模式串向右移動

if (j > t[0]) // 匹配成功

return i - t[0];

else

return 0;

}//index_kmp

int main()

關於KMP演算法

kmp演算法是非常經典的字串匹配演算法,而且有可能是最經典的乙個。同時它也是非常典型的一種優化演算法,它把原本暴力法o mn 的最壞複雜度降低到了o m n 雖然實際上暴力法的執行複雜度期望依然是線性的 其思想非常具有典型性和可借鑑性,值得好好學習。1 基本思想 kmp演算法的基本思想是,借助乙個預...

關於KMP演算法的筆記

以前一直沒有搞懂kmp演算法,突然心血來潮,特意去網上搜尋資料下定決心弄懂,終於在一篇文章的幫助下,對kmp演算法有了自己的理解。這篇文章的出處是 the knuth morris pratt algorithm in my own words 一 什麼是kmp演算法?kmp演算法是一種改進的字串匹...

關於KMP演算法的理解

上次因為haipz組織的比賽中有道題必須用到kmp演算法,因此賽後便了解了下它,在仔細拜讀了孤 影神牛的文章之後有種茅塞頓開的感覺,再次orz。附上鏈結 對於整個kmp演算法,最精髓的部分便是關於next陣列的生成。一開始ruijia liu的書上貼上的 感覺完全不能理解,但是看神犇的分析覺得似乎明...