匹配字符串及KMP算法

news/2024/6/18 20:28:34 标签: 算法, c, 工作
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="htmledit_views">

        匹配字符串常见的class="tags" href="/tags/SuanFa.html" title=算法>算法是࿰c;匹配字符串在被匹配字符串上一个一个向下移动࿰c;如果遇到不匹配࿰c;再回退回来࿰c;继续匹配下去。

     举例:

     被匹配字符串S "acabaabaabcacaabc"

      匹配字符串(也叫模式字符串)P "abaabcac"

      好比现在字符串到accolor:#ff0000">abaabcolor:#00cccc">aabcacaabc(i=7)

                                       color:#ff0000"> abaabcolor:#00cccc">cac (j=5)

      现在遇到不匹配时࿰c;P字符的j退到0位置࿰c;S字符i退到3位置

     

      现在可以看一下KMPclass="tags" href="/tags/SuanFa.html" title=算法>算法࿰c;KMPclass="tags" href="/tags/SuanFa.html" title=算法>算法的思路是在S字符串的i值不回退(就是向上边的i值还是7)࿰c;只是将P中循环的j值匹配到j为2的位置࿰c;为什么是这样呢?

      可以看一下P字符串的规律

       color:#000000">color:#ff0000">abacolor:#ff0000">abcolor:#99ffff">cac

       在c之前两个ab都是相同的࿰c;也就是说在c遇到不匹配的时候c前边的ab如果再来匹配的时候࿰c;在P前边的ab肯定能和c紧挨着的ab匹配上࿰c;那就等下次匹配的时候P开始的ab就不需要匹配了࿰c;将j直接移到j=2的位置a处开始匹配就可以了。这里仅仅是人工的来看࿰c;下边说一下class="tags" href="/tags/SuanFa.html" title=算法>算法的思路࿰c;class="tags" href="/tags/SuanFa.html" title=算法>算法比较专业的说法就是给P的每一位值计算出如果不匹配的时候这个j值应该是多少࿰c;向上边的讨论中࿰c;遇到在c这里不匹配了࿰c;再匹配的时候j的值应该是2.使用书本上的说法就是把这些值先放到next数组中,next数组中存放的就是j要

       看到上边的分析࿰c;应该可以有点思路了吧。

       就是在遇到不匹配的地方࿰c;将前边的字符串分为两半࿰c;像上边的abaab,然后用最大的长度将前后两部分分开࿰c;color:#ff0000">abacolor:#ff0000">ab࿰c;color:#000000">这里j就是匹配的值+1就是2。

 

       class="tags" href="/tags/SuanFa.html" title=算法>算法初始化next[0] = -1;

c="http://hi.csdn.net/attachment/201110/15/0_1318697379DOeu.gif" alt="" />

 

class="tags" href="/tags/SuanFa.html" title=算法>算法的代码

void init_nextv()
{
 int i=0,j=-1;
 int p_len; /*模式串的长度*/
 p_len=strlen(p);
 nextv[0]=-1;
 while(i<p_len-1)
    {
  if(j==-1 || p[i]==p[j])
  {
   ++i;++j;
   if(p[i]!=p[j])nextv[i]=j;
   else nextv[i]=nextv[j];
  }
  else j=nextv[j];
 }
}

 

KMPclass="tags" href="/tags/SuanFa.html" title=算法>算法最主要的是这个next函数的创建࿰c;讲的还不是很清楚࿰c;后续工作还要继续修改

 

 

 

 

 

    

    

cle>

http://www.niftyadmin.cn/n/780480.html

相关文章

typedef和函数指针

先看一个例子&#xff1a; typedef int (*pFun)(int a, int b); pFunpFunTest; 在上边的代码中&#xff0c;初看会使人误解&#xff0c;怎么能使用函数指针pFun来声明一个类型呢&#xff1f; 相信很多人和我都有这样同样的感受。 我就先从typedef说起&#xff0c;使用typed…

二维指针趣谈

先看一段代码&#xff1a; #include <stdio.h> void fun(int **ppTemp) { int a 0; int *pTemp &a; printf("The address of pTemp is %d\n", pTemp); *ppTemp &pTemp; printf("The address of ppTemp is %d\n&qu…

VirtualBox上安装CentOS6.4(一)

自己在virtual box中安装CentOS6.4过程&#xff0c;供大家参考&#xff0c;欢迎转载。 虚拟软件很多&#xff0c;常见的有vmware和virtual box&#xff0c;直观上的区别vmware收费&#xff0c;virtual box免费&#xff0c;如果只注意到这一点&#xff0c;那就有一点初级了&…

VirtualBox安装CentOS6.4(二)

上一篇博客介绍了VirtualBox创建虚拟文件的步骤&#xff0c;这一篇开始介绍安装CentOS6.4 1.安装系统前&#xff0c;如下截图先加载CentOS6.4的镜像&#xff0c;然后点击虚拟机启动来安装 2.启动安装后&#xff0c;centos会提供几种安装类型&#xff0c;我们现在是全新安装&am…

VirtualBox安装CentOS6.4(三)

这一篇博客介绍安装完CentOS后&#xff0c;配置共享目录&#xff0c;以方便虚拟机和windows主机共享操作文件 1.创建共享目录&#xff0c;首先需要在CentOS中安装支持共享目录的文件系统&#xff0c;安装文件默认是在virtualbox安装文件夹中VBoxGuestAdditions.iso&#xff0c…

memcached源码分析一

memcached是一款经典的分布式内存缓存&#xff0c;daemon端代码都是由纯C开发&#xff0c;其中有很多可以学习的地方&#xff0c;陆续将内容加入进来&#xff08;基于版本1.4.15&#xff09;。 开篇&#xff0c;先讲memcached的源码文件概述&#xff0c;看源码的文件依赖&#…

AMQP协议一

AMQP(Advanced Message Queuing Protocol)高级消息队列协议 AMQP是跨语言的协议&#xff0c;提供不同设备间消息生产者和消息消费者之间的操作。基于传输层TCP之后。 翻译版本为V1.0 省略了前言中的说明&#xff0c;从文档结构开始翻译 怎样阅读标准 AMQP规范被定义成几部分…

AMQP协议二

书一 类型 1.1 类型系统 AMQP类型定义了常用的基本类型来用于互相操作数据时的表示。AMQP使用一些额外的语义信息来描述基本类型对应的值。这就允许与AMQP值相关联的一些描述信息作为基本类型出现在规范中。例如&#xff1a;URL通常被定义成字符串&#xff0c;但是不是所有的…