串的模式匹配,KMP算法(解释+源码)

解释大部分是直接copy《王道数据结构》

还有一些是自己总结的,可能有些不太对,还请大家指出

KMP算法

串的模式匹配,KMP算法(解释+源码)_第1张图片串的模式匹配,KMP算法(解释+源码)_第2张图片串的模式匹配,KMP算法(解释+源码)_第3张图片串的模式匹配,KMP算法(解释+源码)_第4张图片

关键点:后移多少位,取决于最长的公共前缀和后缀。

例如:abcabcd

a --> 0

ab --> 0

abc --> a/ab  c/bc --> 0

abca --> a/ab/abc  a/ca/bca --> 1

abcab --> a/ab/abc/abca  b/ab/cab/bcab --> 2

abcabc --> a/ab/abc/abca/abcab   c/bc/abc/cabc/bcabc -->3

abcabcd --> a/ab/abc/abca/abcab/abcabc  d/cd/bcd/abcd/cabcd/bcabcd --> 0

串的模式匹配,KMP算法(解释+源码)_第5张图片

在实际匹配过程中,子串在内存里是不会移动的,而是指针在变化,书中画图举例只是为了让问题描述得更加形象。

若子串j==0时:子串的第j个字符和主串的第i个字符不等时,则主串应从i+1个字符继续与子串的第j个字符进行比较。

若子串j!=0时:子串的第j个字符与主串第i个字符发生失配时,则跳到子串的next[j-1](即前一个元素的部分匹配值)位置重新与主串第i个字符位置进行比较。

串的模式匹配,KMP算法(解释+源码)_第6张图片

串的模式匹配,KMP算法(解释+源码)_第7张图片

你可能感兴趣的:(算法,算法,字符串)