宁夏省建设厅网站,找别人做网站 自己管理,个人网站备注,简易网站制作软件一、目的1.KMP应用场景#xff1a;可以解决字符串匹配问题#xff1b; 在一个串中查找是否出现过另一个串。2.KMP的经典思想就是:当出现字符串不匹配时#xff0c;可以记录一部分之前已经匹配的文本内容#xff0c;利用这些信息避免从头再去做匹配。3.KMP算法关键在于…一、目的1.KMP应用场景可以解决字符串匹配问题 在一个串中查找是否出现过另一个串。2.KMP的经典思想就是:当出现字符串不匹配时可以记录一部分之前已经匹配的文本内容利用这些信息避免从头再去做匹配。3.KMP算法关键在于在当前对文本串和模式串检索的过程中若出现了不匹配如何充分利用已经匹配的部分。4.理解KMP需要搞懂的几个方面什么是前缀表为什么一定要用前缀表如何计算前缀表前缀表与next数组关系构造next数组的几种方法如何使用next数组来做匹配二、理解过程1.例子用模式串去匹配文本串1暴力破解Omn2KMP算法先进行常规匹配到b和f不相等时会直接将f移动到b的位置来匹配因为b前面的两个a已经匹配好了直至匹配完成。2.前缀表用来回退的它记录了模式串与主串(文本串)不匹配时模式串应该从哪里开始重新匹配。1学会找最长相等前后缀关键2前缀包含首字母不包含尾字母的所有子串eg.例子里的前缀有a,aa,aab,aaba,aabaa。 aabaaf就不是前缀即不可以包含尾字母同理后缀f.af.aaf.baaf.abaaf3什么是最长相等前后缀答前缀后缀且最长过程找模式串的最长相等前后缀也就是前缀表利用前缀找最长相等前后缀a 0 a既是前缀又是后缀所以为0aa 1 前一个a是前缀后一个a是后缀且都是a则长度为1aab 0 前缀有aaa后缀有bab整个来讲找的就是前缀的前缀前缀的后缀aaba 1 第一个a和b后的a相等aabaa 2 第一个a和最后的a前aa和后aaaabaaf 0 从而得到前缀表为010120 从图中可知从第一个a开始匹配发现到模式串f时匹配不成功随即立马找f之前的串即aabaa的最长相等前后缀也就是2所以就从模式串位置2即第三个数开始重新匹配.3.next数组可以理解就是前缀表但next数组写法很多1其他写法原始 0 1 0 1 2 0整体右移 -1 0 1 0 1 2整体减1 -1 0 -1 0 1 -1但这里还是用原始的进行操作和编码4.代码实现也就是找最长相等前后缀的过程步骤1初始化next数组和变量2处理前后缀不同的情况3处理前后缀相同的情况4更新nexti代表后缀末尾 j指向前缀末尾也代表包括i之前的最长相等前后缀的长度; 下面是代码和运行过程图代码是伪代码不完整public void getnext(int[] next String s){
// 初始化j next
j 0, next[0] j,
for(i 1; is.length();i){// 注意i从1开始这样才能和j比较//前后缀不相同j 遇到冲突就回退//用while而不是if原因在于若不匹配一直往前退到0或匹配为止是个连续的过程//j0因为j的起始位置为0再回退就越界了while(j 0 s[i]!s[j] ){j next[j-1]; }// 向前回溯回溯前一位的next中的位置//前后缀相同 if(s[i]s[j]) j; 最长相等前后缀长度加1next[i] j; }//将j前缀的长度赋给next【i】不管前后缀是否相同都要存放例题实现strStr() ①先对模式串进行kmp得到next数组即前缀表②将文本串和模式串进行匹配使用next数组保存的最长相等前后缀辅助。