【原理】
(1)next数组原理
(2)特殊情况的处理(巧妙增设哨兵)
(3)递推法构造next[]表
【实现代码】
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 100; char t[maxn]; //text char p[maxn]; int next[maxn]; void getNext(){ int m = strlen(p); int j=0; //"主串指针" next[0] = -1; int t = -1; //模式串指针 while(j<m-1){ if(t<0 || p[j]==p[t]){ next[++j] = ++t; } else{ t=next[t]; } } } int KMP(){ getNext(); //构造next表 int n = strlen(t), i=0;//文本串长度 int m = strlen(p), j=0; //模式串长度 while(j<m && i<n){ if(j<0 || t[i]==p[j]){ //若匹配,一起前进 i++; j++; } else{ //否则,p右移,t不退回 j=next[j]; } } return i-j; } int main(){ cin >> t; // abcdefgabkdabcdu cin >> p; // abkdab cout << KMP(); return 0; }
【参考资料】
邓俊辉教授数据结构
原文地址:https://www.cnblogs.com/chsobin/p/8996058.html
时间: 2024-10-10 06:27:25