第七周 字符串匹配

BF算法,kmp算法

BF:时间复杂度为 O(m*n)

int Index_BF(SString S, SString T, int pos)
{
int i = pos, j = ;
while (i <= S.length &&j <= T.length)
{
if (S.ch[i] == T.ch[j])
{
++i;
++j;
}
else {
i = i - j + ;
j = ;
}
}
if (j > T.length)
return i - T.length;
else
return ;
}

模式串和主串均是存放于字符数组中。(这里是从下标为1开始存储,以便后面操作)

BF比较简单,直接暴力匹配。每次匹配失败,i 回溯到本轮起始位置的下一位。(效率较低)

测试:

结果:

————————————————————————————————————————————————————————————————————

————————————————————————————————————————————————————————————————————

——————————————————————————————————————————————————————————————————-——

KMP:时间复杂度为O(m+n)

因为kmp的思想要写的过程太多(我懒得打字),还有结合字符串图更清晰

所以借鉴:https://www.cnblogs.com/yjiyjige/p/3263858.html

感觉kmp还是很好理解,老师让我讲一遍却又表达不清楚(自己能懂就是不知道怎么把它完整表达出来)

 主要就是 i不用回溯,设立了next[ ]值,即k值,模式串中失配位对应的k值即为下一轮 j重新开始匹配的位置

至于k值得来历,简单点讲 就是为了模式串与主串匹配时减少BF无意义的比较情况,需要在部分匹配成功的

情况下 一次移动k-1 位来提高效率。假设在S主串中的第i位,T模式串的第j为失配,那么i不动,下一次匹配就从第j位

对应的k值开始(j=k=next [ j ]),即下一次从模式串的第k位开始匹配。

计算k值:从kmp算法中,失配后比较的是S的第 i 位与T的第 k 位,那么T中 k 前面的串(k-1)个字符肯定是和S中

i 的前面(k-1)个字符是匹配的。由匹配成功的部分可以得知:S中的i 前面(k-1)个字符又与T中j 前面的(k-1)个字符

是已经匹配成功的,所以前面两句话就等于:

                 T[1...k-1] = T[ j-(k-1)...j-1]

从上面的式子可以看出模式串与主串的比较 变成了模式串自己前缀和后缀的比较,这样找到模式串前缀与后缀所能匹配的最大

长度就等于我们的k-1,也就找出了k;

int Index_KMP(SString S, SString T, int pos, int next[])
{
int i = pos, j = ;
while (i <= S.length&&j <= T.length)
{
if (j == || S.ch[i] == T.ch[j])
{
++i;
++j;
}
else
j = next[j];
}
if (j > T.length)
return i - T.length;
else
return ;
}

下面是next[ ]值计算

例子:

算法:

上面的next值在某些情况下仍有点缺陷,所以有了一个修正next算法

修正next算法:

结果:

  

kmp算法还是挺重要的,理解清楚了还应该记住模板,说不定日后或者OJ用得着呢。

最新文章

  1. android 程序开机自启动
  2. Tomcat中部署后JspFactory报异常的解决方案
  3. Unity3D ShaderLab 创建自定义高光类型
  4. UVA 11624 Fire! (bfs)
  5. C++图结构的图结构操作示例
  6. SQL练习1关于插入删除,修改,单表查询
  7. 正则表达式之 match , findall, sub,subn
  8. Python之文件与目录操作及压缩模块(os、shutil、zipfile、tarfile)
  9. python服务器环境搭建(2)——安装相关软件
  10. lasy load图片的实现
  11. 第四篇:用IntelliJ IDEA 搭建基于jersey的RESTful api
  12. sourcetree 免注册
  13. cocos2d-x3.17 整体概述
  14. 【Latex】常用工具包
  15. 那些不错的 [ Html5 + CSS3 + Canvas ] 效果!
  16. 【java】break,continue和return区别
  17. javascript 高级程序设计 九
  18. UISegmentedControl 改变选中字体的颜色
  19. iOS 提交应用过程出现的错误及#解决方案#images can't contain alpha channels or transparencies
  20. 分布式系统:CAP

热门文章

  1. avalon最佳实践
  2. springboot mvc beetl模板 自定义错误的后缀问题
  3. cdh 安装步骤
  4. Zookeeper的基本概念和重要特性
  5. OpenNebula 4.0 Beta 新特性介绍
  6. mongodb修改用户名密码
  7. xargs在linux中的使用详解-乾颐堂
  8. linux环境下搭建osm_web服务器四(对万国语的地名进行翻译和检索):
  9. python3--json序列化
  10. python 输入输出,file, os模块