(一)素朴匹配算法
一个模式串(String)在另一个主串中的位置,称为字符串匹配。
分别给两个串指定一个指针,模式串的指向0位置,主串的指针则依次向后,若找到了根模式串位置0一样的字符,则模式串和主串依次后移比较,若都相同则匹配,否则模式串指针指向0,主串继续向后。
用这种方法如果比较"abcdefg"和"abcdx"时,子串会与主串的第0-2位比较,但是跟1,2比较其实是没必要的。
(二)KMP
用KMP比较"abcdefg"和"abcdx"比较时,当第一次对比后,子串会直跳过第一次比较过的abcd这些已经比较过的字符往下匹配。也就是跳到第一次比较中主串中与子串不同的字符的位置继续比较。
但是这样的话,又会出现如下的情况:
这样由于子串有重复部分而发生错误。所以在KMP算法中,第一次对比就会知道主串的第3,4位是a,b,因此第二次匹配会从第3位开始,省去前两位比较,直接比较子串的c和主串的第五位。
计算下一次匹配应该移动的位数:
移动位数=当前已匹配个数-部分匹配值;
部分匹配值的计算:部分匹配值就是前缀和后缀共有元素的长度,例如:ABCDA,前缀有【A,AB,ABC,ABCD,ABCDA】,后缀有【A,AD,ADC,ADCB,ADCBA】,所以共有元素即部分匹配值就是1。