BF算法
蛮力算法(Brute-Force),简称BF算法。
算法思想:
从主串T的的第一个字符起与子串P的第一个字符开始比较(主串的第一位由i记录,子串由j记录)。
若相等,i++ j++,然后继续对字符进行后续的比较;
若不相等,i返回到i-1处,j返回0处(回溯),再重新比较。
直至模式串中的每个字符依次和目标串中的一个连续的字符序列相等为止,此时称为匹配成功,否则匹配失败。
图解:
KMP算法
算法思想:
从主串T的的第一个字符起与子串P的第一个字符开始比较(主串的第一位由i记录,子串由j记录)。
若相等,i++ j++,然后继续对字符进行后续的比较;
若不相等,i位置不变,将B串后移,将B串的next[next[j-1]]处于i对齐,从next[next[j-1]]处开始比较(j为发生不匹配时所对应的j,k= next[j-1]),再重新比较。如果next[j-1]=0(相同的前后缀了)则直接把B串向后移一位,直到发现B串的第0位与A串的第i位可以匹配,再重复上面的匹配过程
直至模式串中的每个字符依次和目标串中的一个连续的字符序列相等为止,此时称为匹配成功,否则匹配失败。
Next[]数组的求法:
next[j-1]=x 表示有x个相同的前后缀
匹配开始位置:
A串第0位(第1个字符、i=0)
B串第0位(第1个字符、next[0])
匹配结果:
A的第5位和B的第5位不匹配(注意从0开始编号)此时i=5,j=5
next[j-1]的值:next[5-1]=2
说明:B串的0-1位是与当前(i-2)-(i-1)是匹配的(绿色部分)
下次匹配位置:
A串第5位(第6个字符、i=5)
B串第2位(第3个字符、next[2])
匹配开始位置:
A串第5位(第6个字符、i=5)
B串第2位(第3个字符、next[2])
匹配结果:
A串的第13位和B串的第10位不匹配,此时i=13,j=10
next[j-1]的值:next[10-1]=4
说明:B串的0-3位是与当前(i-4)-(i-1)是匹配的(绿色部分)
下次匹配位置:
A串第13位(第14个字符、i=13)
B串的第4位(第5个字符、next[4])
匹配开始位置:
A串第13位(第14个字符、i=13)
B串的第4位(第5个字符、next[4])
匹配结果:
A串的第13位和B串的第4位依然不匹配,此时i=13,j=4
next[j-1]的值:next[4-1]=1
说明:B串的第0位是与当前i-1位匹配的
下次匹配位置:
A串第13位(第14个字符、i=13)
B串的第1位(第2个字符、next[1])
匹配开始位置:
A串第13位(第14个字符、i=13)
B串的第1位(第2个字符、next[1])
匹配结果:
B串的第1位与A串的第13位不匹配,此时i=13,j=1
next[j-1]的值:next[1-1]=0
说明:已经没有相同的前后缀了
下次匹配位置:
A串第13位(第14个字符、i=13)
B串的第0位(第1个字符、next[0])
Ps:直接把B串向后移一位,直到发现B串的第0位与A串的第i位可以匹配(此处i=13)再重复上面的匹配过程
匹配开始位置:
A串第13位(第14个字符、i=13)
B串的第0位(第1个字符、next[0])
匹配结果:
另外强调一点,当我们将B串向后移的过程其实就是i++,而当我们不动B,而是匹配的时候,就是i++,j++,
代码小白,仅作学习记录