串的匹配
简单模式匹配
原理:两个指针,一个指向主串,一个指向子串,每次对比一个字符,相同后移,不同的化,主指针回溯(i-j+2),子串回到1的位置。
缺点:每次不匹配,主串就需要回溯到最开始的指定位置的下一位重新匹配,所以最坏时间复杂度为O(mn);
KMP算法
KMP算法是在匹配算法的基础上改进的。
原理:通过构建部分匹配数组,每次回溯,主串指针不需要回溯,子串根据部分匹配移动位置。
重点:
前后缀串
:ababa’的前缀{a,ab,aba,abab}∩后缀(a,ba,aba,baba}={a,aba},公共元素有两个,最长相等前后缀长度为3。PM
,部分匹配求next[] 数组
,求出每个子串对应的部分匹配值,为了方面计算,部分匹配值右移,首位补上-1,末尾丢弃这时候,j=next[j]+1。有时候,为了方面后面计算,会直接在数字上+1,直接j=next[j]手推next[]数组
:在考试的时候,还是手推的方式比较方便,如果串的从1开始(不是从0开始),则第二位一定是1,也就是说next[1]=0,next[2]=1,向后推,第三位比较,只需要通过移动子串,判断后面移动之后,这时候j指向的位置就是next[3]的位置,依次类推。
缺陷:虽然只需要子串移动位置,但是移动之后,要比较的字符跟最开始比较的字符相同,所以这几次比较都是无效的。
注意
在实际 KMP 算法中,为了使公式更简洁、计算简单,如果串的位序是从1开始的,
则next 数组才需要整体加1;如果串的位序是从0开始的,则next 数组不需要整体加1。