kmp用于一一匹配问题,如字符串的匹配。
一遇到匹配问题,最初大家想到的就是循环一一对比匹配了,但是那样太慢,这就需要用到kmp了,
它就是很快的,用到最大公共前后缀,
如ABCDABC这个串,我们匹配ABCDABTBCDABC这个长串,当匹配到第7个字符T的时候就不匹配了,用kmp我们就不用直接移到B开始再比一次,而是直接移到第5位来比较,这样可以减少时间
如果不懂可以去听大佬讲解的视频,https://www.bilibili.com/video/av11866460?from=search&seid=8737399042954538208
以下是记录公共前后缀数的数组
void kmpnext(char s[]) { int i=0,j=-1; int n=strlen(s); ne[0]=-1; while(i<len) { if(j==-1||s[i]==s[j]) { i++,j++; ne[i]=j; } else j=ne[j]; } }
以下是kmp的比较过程
int kmp(char *a,char *b)//匹配ab两串,a为父串 { int i=0,j=0; int len1=strlen(a); int len2=strlen(b); getnext(b); while(i<len1&&j<len2) { if(j==-1||a[i]==b[j]) ++i,++j; else j=next[j]; //ABCDABTABCDABC //ABCDABC } if(j==len2) return i-j; else return -1; }
这里是相关习题https://www.cnblogs.com/ylrwj/p/11478327.html
包括
字符串的最大最小表示;
kmp模板;
扩展kmp;