鏈接放在這里,有點難理解,至少我個人是的。
后綴自動機(jī)是一種有限狀態(tài)自動機(jī),其功能是識別字符串是否是母串的后綴。它能解決的問題當(dāng)然不僅僅是判斷是不是后綴這種事,跟字符串的連續(xù)子串有關(guān)的問題都可以往這個方面考慮,畢竟字符串的每個連續(xù)字串都可以看做是兩個長度不同的后綴去掉他們的公共部分得到的。
自動機(jī)由五個部分組成:alpha:字符集,state:狀態(tài)集合,init:初始狀態(tài)集合,end:結(jié)束狀態(tài)集合,trans:狀態(tài)轉(zhuǎn)移函數(shù)。
定義trans(s,ch)為當(dāng)前狀態(tài)為s,讀入字符ch后所達(dá)到的狀態(tài)。若不存在此轉(zhuǎn)移,則將轉(zhuǎn)移的結(jié)果定義為null,表示不存在的狀態(tài)。自動機(jī)A能識別的字符串就是所有使得trans(init,x)∈end的字符串,令這些字符串組成的集合為Reg(A)。另外,對于自動機(jī)中的某一狀態(tài)s,從s開始能識別的字符串記為Reg(s)。
考慮字符串“aabbabd”的后綴,一共有7個,簡單的想法是可以將這7個后綴構(gòu)造成一個trie樹(ppt里的圖好像有問題,多了abbd這條路線),缺點是狀態(tài)數(shù)太多,對于長度為N的字符串,其節(jié)點的規(guī)模會達(dá)到O(N^2),而后綴自動機(jī)相比起來就小多了,其狀態(tài)數(shù)是線性