複習的時候隨便寫寫的,用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的書上貼上的 感覺完全不能理解,但是看神犇的分析覺得似乎明...