这道题目是比较经典的 (KMP) 模板,用一个模式串匹配一个文本串,输出全部匹配的位置
首先考虑最暴力的做法:
我们从最开始的位置暴力匹配,如果成功,那么就返回 (i-j) ,(i)是文本串当前的位置,(j)是模式串当前的位置
否则,我们就回溯到 (i-j+1),因为我们开始匹配的位置是 (i-j) ,那么它的下一位就是 (i-j+1)
复杂度为 (O(n^2))
我们可以发现,当我们在匹配的过程中,我们不一定要返回到 (i-j+1) 开始重新匹配,能不能只让模式串动,而不让文本串动呢?
答案是有的,这就要请到我们今天的主角: (KMP)
(KMP) 本质上的匹配是和暴力一样的,只不过它加了一个 (next) 数组,从而优化了时间复杂度。
当(i) 和(j) 匹配时,那么我们直接令 (i++,j++) ,但如果不匹配呢?
这时,我们就令 (j=next[j]) ,注:(next[j]) 表示的是