next数组
来源:互联网 发布:天猫数据采集 编辑:程序博客网 时间:2024/06/06 14:13
示例图如下:
详解及代码:
//好久没搞了,全都还回去了,以后还是要面试的//所以又回顾了下,已经不知道是第多少次了//我们知道的是,当匹配串和原串匹配失败后//可以回到匹配串的第一个字符进行匹配//然而next数组是怎么做的呢?//next数组就是当与原串进行匹配失败时//匹配串要回到前面的位置的一个集合void getNext(char s[]){ int len=strlen(&s[1]); int j=0; next[1]=0; //next[1]=0也就是第一个字符与原串匹配失败 //这种情况下,原串的前面和匹配串再无相同子串 //所以原串要向后移动一位,匹配串移到第一位 //next[1]=0是一种约定,也为了下面代码好写 for(int i=1;i<=len;) { //1.j<=0也就是上面j=next[1]=0 //说明原串前面和匹配串无相同子串 //故i++向前移动,j++匹配串移到第一位 //与上面说的所有匹配失败,就要回到第一位进行匹配 //2.s[i]==s[j],说明匹配成功了一段子串 //当原串与i+1位匹配失败后,前面的子串都是成功的 //那么自然要移动到j+1位进行匹配 if(j<=0||s[i]==s[j]) { i++; j++; next[i]=j; }else { //匹配失败,根据next数组找到要匹配的位置 //可能会出现连续不匹配的情况,然后使得j=0 j=next[j]; } }}
优化代码:
//前面提到当不匹配时,j=next[j]可能会进行多次//原因是s[i]==s[j](j=next[i])//与s[i]不匹配,与s[j]也不匹配,优化如下:void getNext(char s[]){ int len=strlen(&s[1]); int j=0; next[0]=next[1]=0; for(int i=1;i<=len;) { if(j<=0||s[i]==s[j]) { i++; j++; //当前面子串相同时,s[i+1]匹配不成功 //需要跳到j+1,那么如果s[i+1]==s[j+1] //跳到j+1就相当于还要跳一次,故不如跳到next[j+1]处 if(s[i]!=s[j]) next[i]=j; else next[i]=next[j]; }else { j=next[j]; } }}
0 0
- next数组
- next数组
- next数组
- next数组
- poj2406(next数组理解)
- next数组介绍
- KMP 算法 next数组
- next数组的理解
- next数组介绍
- Period +uvalive+next数组
- 求next数组代码
- 数组 Next Permutation
- KMP next数组详解
- KMP中的next数组
- KMP 模板 next数组
- next数组代码
- 浅谈next数组
- next数组介绍
- 前端复习--window.name跨域完全搞定
- CSS元素隐藏、display:none和visibility:hidden、height:0和overflow:hidden的组合
- 70. 打印所有Spring boot载入的bean
- java 面向对象 接口与多态
- w7下ecilpse3无法修改字体大小问题
- next数组
- Mo-odsNote2.5
- 贝叶斯网络
- 71. mybatis 如何获取插入的id【从零开始学习SpirngBoot】
- 【斯坦福《机器学习》笔记】[第2集] 监督学习应用.梯度下降
- 第三周项目4 - 顺序表应用
- hdu5890 Eighty seven(DP)
- 72. Spring Boot注解(annotation)列表
- TCP协议及其建立终止