这题因为题目数据比较小,可以用kmp,可以用朴素的枚举,对于小数据枚举的效率和kmp的差不多,因为公共字串的长度并不是很长
做这题第一次题意没理解到位,它要求按字母表顺寻输出<长度相同时,字母小的排前面>,WA了一次
再次推了一遍KMP next[]的求法<未>,设原始模式串为s
设k=next[j],且j+1之前的next值都以求出,即s[j]失配时,s[j]应与s[k]比较;则有s0s1...sk-1=sj-ksj-k+2...sj-1 {0<=k<j}
如果s[k]=s[j] 则有s0s1...sk-1sk=sj-ksj-k+2...sj-1sj{0<=k<j}
next[j+1]=next[j]+1=k+1;
如果s[k]!=s[j],那么将s0s1...sk看成新的模式串,主串为原始串s,从j位置开始匹配<自己匹配自己>,则根据假设s[j]应继续与s[next[k]]比较,依次前推,到边界next[0]=-1<程序实现的时候表示模式串从头开始匹配,主串无条件右移一格>;
这样由此算法我们就可以顺推next数组:
如果s[j]=s[next[k]],那么next[j+1]=next[k]+1;
否则 k=next[k],继续直至k=-1,则右移模式串,主串无条件右移一格。
说实话,kmp的代码真的称得上完美,第一次编肯定很难得写出,应该仔细体会。