KMP算法
简单模式匹配算法 对于一个串中某子串的定位操作称为模式匹配 int i=1,j=1,k=i; //从主串和模式串第一个位置开始遍历 while(i <= s_length && j <= t_length){ if(s[i]==t[j]){//如果相等,则都向后进一位 ++i; ++j; } else{ //如果不相等,则 i 回溯到下一位,j 回溯到模式串第一位,重新依次比较 j=1; i=++k; //或写为i=i-j+2; } } if(j > t_length)cout<<k<<endl; else cout<<"NO"<<endl; KMP算法 简单模式匹配算法需要不断回溯主串和子串,但是KMP算法只需要回溯字串,这就是它更快的原因 原来需要将子串回溯到下标为1,将主串回溯到下一位,KMP算法只需要将子串下标 j 回溯到 next[j] 的位置,所以 求next数组 就是它的核心 出现了几个个问题: 1.next数组存的是什么? 为什么只用将子串下标 j 回溯到 next[j]的位置就能达到我们想要的效果? 2.怎么求next数组。 1.next[j]数组存的是如果主串和子串失配,j要回溯的那个位置 如图,如果按照原来的方法,主串和子串都需要回溯比较,但是我们发现有一些比较其实是可以省略的,观察图中,发现 a. 比较下标前面的子串完全匹配。 b.