- 12
- 0
- 约1.73万字
- 约 64页
- 2017-06-02 发布于湖北
- 举报
3.字符串剖析
3.3.2 KMP算法 假设已有next函数,则KMP算法如下: int StrIndex_KMP(char *s,char *t,int pos) /*从串s的第pos个字符开始找首次与串t相等的子串*/ { int i=pos,j=1,slen,tlen; while (i=s[0] j=t[0] ) /*都没遇到结束符*/ { if (j==0||s[i]==t[j]) { i++; j++; } else { j=next[j]; /*回溯*/ } } if (jt[0]) { return i-t[0]; /*匹配成功,返回存储位置*/ } else { return –1; } } O(m*n) OR O(m+n) 3.3.2 KMP算法 next函数值仅取决于模式本身而和主串无关。 从分析next函数的定义出发用递推的方法求next函数值。 该如何求next函数呢? 由定义可知: next[1]=0 设 next[j]=k,则有: "t1 t2 … tk-1" ="tj-k+1 tj-k+2 … tj-1 " next[j+1]=? 可能有两种情况: 第一种情况:若 tk=tj 则表明在模式串中 "t1 t2 … tk-1 tk " ="tj-k+1 tj-k+2 … tj-1 tj " next[j+1]=next[j]+1 3.3.2 KMP算法 第二种情况:若tk ≠tj 则: 把求next函数值的问题看成是一个模式匹配问题,整个模式串既是主串又是模式。 当tk ≠tj 时应将模式向右滑动,使得第next[k]个字符和“主串”中的第j个字符相比较。 若next[k]=k′,且t k′=tj,则说明在主串中第j+1个字符之前存在一个最大长度为k′的子串,使得 "t1 t2 … t k′ "="tj-k′+1 tj- k′+2 … tj " 因此: next[j+1]=next[k]+1 同理若t k′≠tj,则将模式继续向右滑动至使第next[k′]个字符和tj 对齐,依此类推,直至tj 和模式中的某个字符匹配成功或者不存在任何 k′能匹配成功。 若t1≠tj+1 , 则有:next[j+1]=1 否则若t1=tj+1 ,则有:next[j+1]=0 3.3.2 KMP算法 求next函数值过程的算法如下: void GetNext(char *t,int next[ ]) /*求模式t的next值并寸入next数组中*/ { int i=1,j=0; next[1]=0; while (it[0]) { while (j0t[i]!=t[j]) { j=next[j]; } i++; j++; if (t[i]==t[j]) { next[i]=next[j]; } else { next[i]=j; } } } O(m) 3.3.3 基于KMP算法的应用 ACM/ICPC的实战练习题Oulipo ,[POJ 3461] 题目要求:给出两个字符串,求出模式串T在主串S中出现了多少次。其中T长1万,S长1百万。 解题思路: (1) 因为问题规模较大,所以本题用BF算法肯定超时; (2) 那就用KMP算法,关键还是在于next
您可能关注的文档
最近下载
- 2025年江苏经贸职业技术学院单招笔试职业能力测验试题库含答案解析.docx VIP
- 2025年-第二届全国高校教师教学创新大赛获奖课件1课程思政教学设计-新版.pptx
- 通信工程领域数智化技术的应用现状与前景.docx VIP
- (2026春新版)人教版三年级数学下册全册教案.doc
- 井筒三维可视化方法及装置.pdf VIP
- 安全隐患规范依据查询手册(2026版)-157页 (1).docx
- 2026道德与法治一年级下册全册教学设计.pdf
- 贵州省2024年高职(专科)分类考试招生中职毕业生文化综合考试数学.docx VIP
- 中央企业高质量数据集建设研究报告.pptx VIP
- 2023版马原马克思主义基本原理(2023年版)ppt全套教学课件.ppt
原创力文档

文档评论(0)