提示二:NEXT数组的使用

“那么,为了能够充分理解NEXT数组,我们再来回顾一下如何使用NEXT数组~"小Hi摆出一副老师的样子,说道。”首先我们来给出NEXT数组的数学定义~“

NEXT[0] = -1NEXT[i] = max{ 0<=k< i | str.substring(1, k) == str.substring(i - k +1 , i) } 其中str.substring(i, j)表示str从位置i到位置j的子串,如果i>j则,substring为空

”那么我们对之前例子中的模式串进行求解,可以得到这样的NEXT数组。“小Hi在纸上写了又写,画了又画。

模式串:

b a b a b b

NEXT:

0 0 1 2 3 1

”然后再来看这个NEXT数组是如何使用的!为了表明NEXT的所有使用情况,我们换一个原串。然后首先,我们第一次匹配,如果 用ori表示原串,用par表示模式串,用p表示原串的下标(从1开始),用q表示模式串的下标(从1开始)的话,会发现最多匹配到p=5, q=5就不能往下匹配了,因为此时ori[p +1]不等于par[q + 1]“小Hi为了使说明更加简洁,先下了一堆定义。

”好的!小Hi老师好棒!“小Ho在一旁煽风点火道。

原串(p=5):

babab | abcbababababb

模式串(q=5):

babab | b

”此时,令q = NEXT[q],并将ori[1..p]和par[1..q]对齐,便会发现ori[1..p]和par[1..q]仍然是一一对应的。“

原串(p=5):

babab | abcbababababb

模式串(q=3):

bab | abb

“此时,ori[p+1]和par[q+1]相同了,于是可以继续往下匹配,但是到了p=7,q=5的时候又发现不能够接着匹配了。”

原串(p=7):

bababab | cbababababb

模式串(q=5):

babab | b

”此时,令q = NEXT[q],并将ori[1..p]和par[1..q]对齐,便会发现ori[1..p]和par[1..q]仍然是一一对应的,这和之前是一样的。”

原串(p=7):

bababab | cbababababb

模式串(q=3):

bab | abb

“此时,ori[p+1]和par[q+1]仍然不相同,于是还得令q=NEXT[q]。”

原串(p=7):

bababab | cbababababb

模式串(q=1):

b | ababb

“此时,ori[p+1]和par[q+1]仍然不相同,令q=NEXT[q]。”

原串(p=7):

bababab | cbababababb

模式串(q=0):

| bababb

“此时,ori[p+1]和par[q+1]仍然不相同,令q=NEXT[q]。”

原串(p=7):

bababab | cbababababb

模式串(q=-1):

|   bababb

”到了这一步,就相当于我们之前所说的模式串与原串的对齐点(即枚举的原串中的起点位置)越过了这条线(当时指C右侧的那条线)的情况,这种情况下,就应当p和q均+1,然后继续之前的操作。”小Hi擦了一把汗,说道。

“这样一说,我就大致能够理解NEXT数组是怎么用来求解模式匹配问题的了,但是它是如何求的呢?一般的方法不是要O(模式串长度的立方)的么?”小Ho问道。

“这就是我接下来要和你说的啦!”小Hi笑道:“但是让我先喝口水!”

提示三:如何求解NEXT数组

“首先我们不想如何求整个NEXT数组,而是假设我们已经知道了之前例子中模式串的NEXT[1..4],来求NEXT[5]如何?”小Hi建议道。

“好的!这样我们就只需要平方级的算法就可以算出它的值了!”小Ho高兴道。

“有点追求好不好!”小Hi深深的吸了一口气:“你这样和之前的解法有什么不同么!”

“似乎没有。。那你说怎么算吧!我反正脑子已经成浆糊了。”小Ho郁闷道。

“我们把par.substring(1, 5)当做新的原串ori_new,然后把par.substring(1, 4)当做新的模式串par,会如何?”小Hi微微一笑。

“会。。我来试试!"小Ho接过小Hi手中的纸笔,便开始演算:“首先就直接匹配到了p=4, q=4的情况,这时候严格来说已经算匹配完成了,但是肯定不是就这么结束的,此时par_new[q +1]因为是空字符,所以肯定和ori_new[p+1]匹配不上。于是令q = NEXT[q]”

原串(p=4):

baba | b

模式串(q=4):

baba |

原串(p=4):

baba | b

模式串(q=2):

ba | b

”然后这时候ori_new[p + 1]就直接和par_new[q + 1]匹配上了,于是新的p=5,q=3,莫非……这个最后的q就是NEXT[5]!“小Ho忽然灵光一闪。

”没错,就是这样!那你想想现在如何求NEXT[6]。“小Hi继续引导小Ho。

”首先我们没有必要重新从头开始匹配,直接在原串和模式串的后面加上第6个字符就可以了。“小Ho分析道。

原串(p=5):

babab | b

模式串(q=3):

bab | abb

”没法继续匹配,于是令q=NEXT[q]。“

原串(p=5):

babab | b

模式串(q=1):

b | ababb

”还是没法继续匹配,于是令q=NEXT[q]。“

原串(p=5):

babab | b

模式串(q=0):

| bababb

”此时可以匹配了,新的p=6,q=1,所以NEXT[6]就是1!“小Ho高兴道:”没想到NEXT数组的本身会用一种递归的方式进行求解,真是太巧妙了!“

”那你要不要赶紧去写一下代码,KMP算法的代码可是可以写的很短很巧妙的哦!~“小Hi建议道。

”好!“

/** next[]的含义: x[i-next[i]...i-1]=x[0...next[i]-1]* next[i]为满足x[i-z...i-1]=x[0...z-1]的最大z值(就是x的自身匹配)*/
void kmp_pre(char x[],int m,int next[])
{int i,j;j = next[0] = -1;i = 0;while(i < m){while(-1 != j && x[i] != x[j]) j = next[j];next[++i] = ++j;}
}
int next[10010];
int KMP_Count(char x[],int m,char y[],int n)
{//x是模式串, y是主串int i, j;int ans = 0;kmp_pre(x, m, next);i = j = 0;while(i < n){while(-1 != j && y[i] != x[j]) j = next[j];i++; j++;if(j >= m){ans++;j = next[j];}}return ans;
}

hihocoder 第三周相关推荐

  1. 提高班第三周周记(中秋第一天)

    这是第三周,也是中秋节.没有月饼的中秋节.但我过得很充实.我很快乐,发自内心的. 中秋第一天早上贾琳师哥讲课.讲他为什么辞职来这里.他的确学成,有着令人羡慕的工资.可是他的问题让我触动. 提到了邓稼先 ...

  2. python嵩天课堂笔记_[Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周)

    [Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) [Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) 目录 强化学习 定义 马尔科夫决策过程 基本元素 值函数 最优值 ...

  3. 在首次发布三周之后,MLflow迎来了0.2版本

    在今年的Spark+AI峰会上,MLflow团队推出了MLflow,一个开源的用于简化机器学习生命周期的平台.从首次发布到现在的三周时间里,已经有很多数据科学家和工程师对使用MLflow和为MLflo ...

  4. 清华贵系的期末大作业:奋战三周,造台计算机!

    大数据文摘授权转载自AI科技评论 作者 | 蒋宝尚 编辑丨陈彩娴 本科大三,正在学习计算机组成原理,能做个什么项目? 清华大学贵系说:造台计算机吧! 清华有门本科三年级必修课,名为<计算机组成原 ...

  5. 三周写出高性能的Python代码,这些小技巧你值得一试。

    1一个不上进的 Python 使用者 我是一个有 C 语言背景的开发者.最近转做了 Python,平时用 Python 还算 6,这周在给新员工分享工作之后,有个小孩跑来问我:"哥,你是学 ...

  6. 5月第三周全球域名解析商Top15:万网DNSPod份额上涨

    IDC评述网(idcps.com)05月27日报道:据域名统计机构WebHosting.info数据得知,在5月第三周(5月13日-5月19日)期间,全球域名市场基本保持稳定.与上周相比,美国域名解析 ...

  7. 2019-2020-3 《Java 程序设计》第三周知识总结

    2019-2020-3 <Java 程序设计>第三周知识总结 1.类的定义 语法格式如下(加[]表示可选项): [修饰符] class 类名 { 属性定义(声明) 方法定义(声明)} 2. ...

  8. 学号 20172326 《程序设计与数据结构》第三周学习总结

    学号 20172326 <程序设计与数据结构>第三周学习总结 教材学习内容总结 队列是先进先出的数据结构(FIFO)与栈不同,队列的两端可分别进行操作 first与front相同,返回首段 ...

  9. .INFO域名总量跌破700万,8月第三周净减51,477个

    中国IDC评述网08月23日报道:近日,据WebHosting.info公布的数据显示,截至2012年8月20日,全球.INFO域名注册总量已跌破700万个,为6,976,763个,8月第二周持续负增 ...

最新文章

  1. KVO方式监听数组的变化动态刷新tableView
  2. mysql查询每个id的前10条数据_解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据...
  3. 高性能MySQL(二)
  4. 【CSS基础】实现 div 里的内容垂直水平居中
  5. linux 视频编辑 ffmpeg,ffmpeg转码视频真的好用!(ffmpeg的简单使用方法)
  6. html5填空题阅卷,“过五关”般严格,高考阅卷老师来自哪里?研究生参与阅卷?
  7. Graph Embedding及其在知乎的实践(附pdf下载链接)
  8. Salt: 2015.8.8.2 L@匹配BUG
  9. 利用Scrapy爬取拉勾网某职位信息
  10. 深度学习优化算法大全系列1:概览
  11. Red5java.util.concurrent.RejectedExecutionExceptio
  12. 谈谈如何学习R语言基础教程
  13. 用户分层 | 用户画像
  14. PHP消息队列的实现方式
  15. 2020年你还不会做绿幕特效?这4步基础技巧要点了解一下!
  16. RK3568 Android12 长按power键功能设置
  17. create-react-app创建的项目配置多入口MPA模式。报Cannot read property ‘filter’ of undefined
  18. CALayer创建图层(转)
  19. FreeRTOS信号量
  20. 【移动通信】5GC:5G的QoS (Quality of Service) 控制 服务质量管理

热门文章

  1. 运维系统常用健康度模型浅析
  2. 电商直播系统开发Android10.0 导航栏和状态栏动态控制合集
  3. 声学混响中说的RT60是什么意思?
  4. python将文字转换为语音_python把文字转成语音
  5. Win10 打印机共享问题解决实录
  6. Python pandas在读取csv文件时(linux与windows之间传输),数据行数不一致的问题
  7. 基于单片机的GPS模块
  8. “粽子第一股“来了!老字号五芳斋还有新故事?
  9. 微信小程序利用canvas画出根据文字自适应的边框
  10. TensorFlow Win10 stage.3