链接放在这里,有点难理解,至少我个人是的。

  后缀自动机是一种有限状态自动机,其功能是识别字符串是否是母串的后缀。它能解决的问题当然不仅仅是判断是不是后缀这种事,跟字符串的连续子串有关的问题都可以往这个方面考虑,毕竟字符串的每个连续字串都可以看做是两个长度不同的后缀去掉他们的公共部分得到的。

  自动机由五个部分组成:alpha:字符集,state:状态集合,init:初始状态集合,end:结束状态集合,trans:状态转移函数。

  定义trans(s,ch)为当前状态为s,读入字符ch后所达到的状态。若不存在此转移,则将转移的结果定义为null,表示不存在的状态。自动机A能识别的字符串就是所有使得trans(init,x)∈end的字符串,令这些字符串组成的集合为Reg(A)。另外,对于自动机中的某一状态s,从s开始能识别的字符串记为Reg(s)。

  考虑字符串“aabbabd”的后缀,一共有7个,简单的想法是可以将这7个后缀构造成一个trie树(ppt里的图好像有问题,多了abbd这条路线),缺点是状态数太多,对于长度为N的字符串,其节点的规模会达到O(N^2),而后缀自动机相比起来就小多了,其状态数是线性

网友评论