poj3080 blue Jeans


这题因为题目数据比较小,可以用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的代码真的称得上完美,第一次编肯定很难得写出,应该仔细体会。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值