- 背景:
上课的时候,老师讲:这种题目要用KMP算法,当时我心里就想,我又不是傻子,鬼才用呢,那么麻烦,还要求next[]数组…最近做了几个题目,才发现,真香 哈哈,现在想想,我以前是脑子进水了吧?干嘛不用KMP呢…
(在比较正规的比赛里面,如果不用KMP,你将会看到"Time Limit Exceeded")
2.大大怪将军:“废话不多说,来人,上题目。”
小小怪下士:“报告将军,没找到题目。。。。。。。”
大大怪将军:“不管了,开炮!开炮!。。。。。。。”
首先,让我们先求出一个next[]数组,不要问我这个数组是干嘛的,因为。。。。。你懂得,呵呵呵
next[0]=-1;
int k=-1,j=0;
while(j<s.length()-1){
if(k==-1||s[k]==s[j])
next[++j]=++k;
else
k=next[k];
}
你肯定会这么想,“我靠,这么短,这是盗版的吧。。。。别慌,这确实是正版的,由于水平有限,我只能写一点注释”
就拿这串字符串来讲:“abcdabc”这串字符串得到的next[]是“-1 0 0 0 0 1 2”这串数字就是你今后,在哪里失配,需要跳转的位置。。。。这个字符串是这样的“abc”“d”“abc”组成的,(别问为什么,因为我是故意的)当你在第2个“abc”里面的c位置失配时,这是next[]里面对应的是2,下次移动的时候,你就可以直接跑到第一组“abc”的c那个位置继续匹配(怎么感觉像是打王者荣耀排位。。。)
相信你看完我这段话,肯定还是不理解,(估计心里骂我一千遍了)所以。。。。
来人,传送门:别点我
别谢我,我容易飘。。。嘿嘿嘿