模式匹配算法,就是给出两个字符串,找出长串中首次出现完全与短串相同字符串的位置。这里将长称成为主串,设为S,短串称模式串,设为T。
一般的模式匹配可以直接用暴力破解,将S串与T串一位位地进行匹配,一旦出现不匹配的情况,就将S串回溯到原始出发点的下一位,将T串回溯到起点。暴力破解的问题在于,遇到子串中有重复字符前后缀的时候,会出现不必要的回溯。此时就可用kmp算法提高效率。
kmp算法的匹配算法和暴力破解差别不很大,但是这里不对S串进行回溯,只对T串进行回溯。而next数组的作用就是指导在匹配失败时,T串应该回溯到什么位置。
next数组的长度和T串相同,这里的下标从1开始,它的计算规则是:next[1] = 0; next[i] 的值,由T[1]~T[i-1]位置的字符串决定,值为这一段字符串中的前缀和后缀相同的位数加1;在没有相同的前缀后缀时,置1。
示例:“ababaaaba” 011234223、“abcabx” 011123 、“aaaaab” 012345