提示二: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. SAP Promotion Managementfor Retail (SAP PMR)
  2. c语言移数有n个整数使其,有N个整数,使其前面各数顺序向后移动M个位置,最后M个数变成前面的...
  3. php的cgi的设置,apache中配置php支持模块模式、cgi模式和fastcgi模式
  4. C# 的 Console类
  5. call/apply以及this指向的理解
  6. 计算机控制面板图标显示,Win8桌面如何有计算机/控制面板图标
  7. 探讨 | 深入探讨Redis管道
  8. 三菱fx3u通讯手册_使用USR-N510实现局域网内连接FX3U
  9. 明天发布一个基于Silverlight的类Visio小型绘图工具项目。
  10. 自带CA ,sha256 哈希签名,2048 位加密 脚本,通用
  11. www.icourse163.org中国大学MOOC网页端无法打开或显示不全的解决方法
  12. 四川师范大学大学计算机基础,大学计算机基础课程教学改革探索——以四川师范大学为例...
  13. 微信小程序点击事件传递参数
  14. SIFT特征匹配算法介绍——寻找图像特征点的原理
  15. 企信下载的文件在哪里_Foobar2000(无损音乐播放器下载)(软件篇)
  16. win7安装Android Studio
  17. ArcGIS中shp文件的裁剪
  18. 智能人物画像综合分析系统——Day7
  19. SLE12 Server 在线安装MySQL Server
  20. Android 这些技术 —— 你都了解过吗

热门文章

  1. js产品360度旋转预览图片插件
  2. UiPath官网认证培训
  3. linux 安装R 环境(最新)
  4. 智能车竞赛:关于车模系列的价格调整
  5. Flex 2.0 软件及文档下载
  6. Android修改设置文字转语音输出,默认语速
  7. 2019电商生意经(五):明确中台化的概念、形式与战略
  8. 一劳永逸去除Word文档修订和批注帮助
  9. 用源码论述Eclipse学习体会
  10. 机器学习:决策树-基础算法,剪枝,连续值缺失值处理,多变量决策树(附代码实现)