这一题的第一个答案就是n*c+l-1(也就是说任意两个相邻的字符串都可以共用l-1个字符),证明如下:
我们首先列出c^(l-1)个点,代表c^(l-1)种字符串的前缀,然后我们又把每一个点连出c条边,代表连向字符串的后缀。举个例子:
abcd分别连向
bcda
bcdb
bcdc
bcdd
(上面的后l-2个要与下面的前l-2个相同,两个字符串分别表示一个长度为l的字符串的前l-1个与后l-1个,连边的权值为后一个字符串的最后一个字母),由于每一个点都有c条出边于入边,所以这个图一定会有一条欧拉回路,那么就证明了命题。
关键是怎样求欧拉回路。并且在此拓展一下有关欧拉回路的问题。
欧拉回路:从一个点开始,每一条边都恰好经过一次地回到起点
欧拉路径:从一个点开始,每一条边都恰好经过一次地在任意点结束
对于有向图,若每一个点的入度等于出度,则存在欧拉回路。
若所有点的度数都一样,或有两个点一个多1一个少1,那么有欧拉路径
对于无向图,若所有的点的度数都是偶数,那么存在欧拉回路
若有0或2个点的度数为奇数,那么存在欧拉路径
欧拉回路的求法之一:圈套圈算法
步骤如下
1、从任意点i开始,找到一个任意的环p0p1p2...pt(p0=pt=i),并把pj作为待搜索点
2、从任意pj开始,用1的方式找还环g0g1g2...gh(g0=gh=pj),那么g便可以插入p中,变成p0p1...pjg1g2...ghpj+1pj+2...pt
3、重复刚才的步骤,最终便可以找出欧拉回路了
时间复杂度O(边数)