首先考虑完整两串的匹配(我知道可以kmp,但是模糊匹配的思路需要从这里引出
假设短串a长为lena长串b长为lenb
我们知道两串如果完整匹配,他们每一个位置都要相同,即a[i]−b[y+i]=0a[i]-b[y+i]=0a[i]−b[y+i]=0
所以说a要完整匹配要满足:
∑i=0lenaa[i]−b[y+i]=0\sum_{i=0}^{lena} a[i]-b[y+i]=0i=0∑lenaa[i]−b[y+i]=0
这是必要条件,不是充分条件,因为我们发现bd和cc按这种规则也能匹配,为了使偏差的增量恒为正,我们给他平方一下
∑i=0lena(a[i]−b[y+i])2=0\sum_{i=0}^{lena} (a[i]-b[y+i])^2=0i=0∑lena(a[i]−b[y+i])2=0
这个时候复杂度显然是n^2的,考虑优化,我们把短串反转记为c,则a[i]=c[lena−i]a[i]=c[lena-i]a[i]=c[lena−i]
∑i=0lena(c[lena−i]−b[y+i])2=0\sum_{i=0}^{lena} (c[lena-i]-b[y+i])^2=0i=0∑lena(c[lena−i]−b[y+i])2=0
∑i=0lena(c[lena−i])2+∑i=0lena(b[y+i])2−2∑i=0lena(c[lena−i]b[y+i])=0\sum_{i=0}^{lena} (c[lena-i])^2+\sum_{i=0}^{lena}(b[y+i])^2-2\sum_{i=0}^{lena}(c[lena-i]b[y+i])=0i=0∑lena(c[lena−i])2+i=0∑lena(b[y+i])
洛谷P4173 残缺的字符串(FFT匹配字符串)
最新推荐文章于 2022-02-24 10:57:44 发布