首先考虑完整两串的匹配(我知道可以kmp,但是模糊匹配的思路需要从这里引出
假设短串a长为lena长串b长为lenb
我们知道两串如果完整匹配,他们每一个位置都要相同,即 a [ i ] − b [ y + i ] = 0 a[i]-b[y+i]=0 a[i]−b[y+i]=0
所以说a要完整匹配要满足:
∑ i = 0 l e n a a [ i ] − b [ y + i ] = 0 \sum_{i=0}^{lena} a[i]-b[y+i]=0 i=0∑lenaa[i]−b[y+i]=0
这是必要条件,不是充分条件,因为我们发现bd和cc按这种规则也能匹配,为了使偏差的增量恒为正,我们给他平方一下
∑ i = 0 l e n a ( a [ i ] − b [ y + i ] ) 2 = 0 \sum_{i=0}^{lena} (a[i]-b[y+i])^2=0 i=0∑lena(a[i]−b[y+i])2=0
这个时候复杂度显然是n^2的,考虑优化,我们把短串反转记为c,则 a [ i ] = c [ l e n a − i ] a[i]=c[lena-i] a[i]=c[lena−i]
∑ i = 0 l e n a ( c [ l e n a − i ] − b [ y + i ] ) 2 = 0 \sum_{i=0}^{lena} (c[lena-i]-b[y+i])^2=0 i=0∑lena(c[lena−i]−b[y+i])2=0
∑ i = 0 l e n a ( c [ l e n a − i ] ) 2 + ∑ i = 0 l e n a ( b [ y + i ] ) 2 − 2 ∑ i = 0 l e n a ( c [ l e n a − 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])=0 i=0