33、串的模式匹配-Brute-Force算法_brute-force算法思想-程序员宅基地

技术标签: Brute-Force算法  串的模式匹配  算法与数据结构  

 一、与串相关的概念

1、串(或字符串)是由零个或多个字符组成的有限序列。一般记作:s=〃c0c1c2…cn-1〃(n≥0)。零个字符的串称为空串,通常以两个相邻的双引号来表示空串,仅由空格组成的的串称为空格串,如:s=〃    〃;

2、串与线性表的异同。字符串一般简称为串,可以将它看作是一种特殊的线性表,这种线性表的数据元素的类型总是字符型的,字符串的数据对象约束为字符集。在线性表的基本操作中,大多以“单个元素”作为操作对象,而在串中,则是以“串的整体”或一部分作为操作对象。因此,线性表和串的操作有很大的不同。

3、当两个串的长度相等且各对应位置上的字符都相同时,这两个串是相等的。串中任意个连续字符组成的序列称为该串的子串。包含子串的串被称为主串。

4、模式匹配:子串定位运算称为模式匹配(Pattern Matching)或串匹配(String Matching)。模式匹配成功是指在目标串s中找到一个模式串t;模式匹配不成功则指目标串s中不存在模式串t。在串匹配中,一般将主串称为目标串,子串称之为模式串。

二、串的几种表示方法

1、顺序存储结构 (静态)

分配一组地址连续的存储单元存放串值的字符序列。

        #define MAXSTRLEN  255

         typedefunsigned char SString[MAXSTRLEN+1];

2、串的块链存储表示

块,一组连续的字符。块链存储表示,把串分成指定等长的块,每一块用一个结点表示,把各块链成一个链表。当一个结点不满时,用特殊字符(如‘#’)填充。若块的长度为1,就是以单字符为结点的链表结构。

#define CHUNKSIZE  <结点的大小> ;  //定义结点的大小 

  typedef struct Chunk {               //结点结构 

  char str[CHUNKSIZE];

  struct Chunk  *next;

                    } Lstring;

块的大小与存储密度有关:

3、堆分配存储表示(常用)

堆存储结构的特点是,仍以一组空间足够大的、地址连续的存储单元存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配的。所以也称为动态存储分配的顺序表。每当产生一个新串时,系统就从剩余空间的起始处为串值分配一个长度和串值长度相等的存储空间。

在C语言中,存在一个称为“堆”的自由空间,由动态分配函数malloc()分配一块实际串长所需的存储空间,如果分配成功,则返回这段空间的起始地址,作为串的基址。由free()释放串不再需要的空间。       

C语言对堆分配存储结构的定义如下:

typedef struct{

   char *str;

   int curlen;

 }Hstring; 

三、Brute-Force算法的思想

Brute-Force算法的基本思想是:从目标串s 的第一个字符起和模式串t的第一个字符进行比较,若相等,则继续逐个比较后续字符,否则从串s 的第二个字符起再重新和串t进行比较。依此类推,直至串t 中的每个字符依次和串s的一个连续的字符序列相等,则称模式匹配成功,此时串t的第一个字符在串s 中的位置就是t 在s中的位置,否则模式匹配不成功。

四、Brute-Force算法的C语言描述

五、Brute-Force算法的C语言实现

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

#include "ctype.h"

#define OK 1

#define ERROR 0

typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等

typedef int Boolean; // Boolean是布尔类型,其值是TRUE或false

#define N 16 // 数据元素个数

#define MAXKEYLEN 16 // 关键字的最大长度

#define STACK_INIT_SIZE 10 // 存储空间初始分配量

#define STACKINCREMENT 2 // 存储空间分配增量

typedef struct

{

char *ch;

int length;

}HString;

void InitString(HString &T)

 { // 初始化(产生空串)字符串T

   T.length=0;

   T.ch=NULL;

 }//InitString

int StrAssign(HString&T,char *chars)

{// 生成一个其值等于串常量chars的串T

int i,j;

if(T.ch)

      free(T.ch); //释放T原有空间

i=strlen(chars);//求chars的长度i

if(!i)

   {//chars的长度为0

    T.ch=NULL;

      T.length=0;

   }//if

else

   {

    T.ch=(char*)malloc(i*sizeof(char));//分配串空间

      if(!T.ch) exit(-1); //失败

      for(j=0;j<i;j++)

             T.ch[j]=chars[j];

      T.length=i;

   }//else

return OK;

}//StrAssign

void StrPrint(HString &T)

{

int i;

for(i=0;i<T.length;i++)

      printf("%c",T.ch[i]);

printf("\n");

}//StrPrint

 

int Index(HString s,HStringt,int pos)

{

int i,j;

i=pos;                         //指向串s的第1个字符

j=0;                         //指向串t的第1个字符

while((i<s.length)&&(j<t.length))

  if(s.ch[i]==t.ch[j])     //比较两个子串是否相等

   { ++i;                     //继续比较后继字符

     ++j; 

   }//if

  else 

    {  

      i=i-j+1;                //串s指针回溯重新开始寻找串t,注意,在算法中我们的存储结构是数组,我//们在此实现中,采用的是堆,导致语句有点小不一样。

    j=0; 

      }//else

if(j>=t.length)return(i-t.length+1);  //匹配成功,返回模式串t在串s中的起始位置

else  return 0;                  //匹配失败返回0

}

void OutprintS(HString &t)

{

printf("串t为: ");

StrPrint(t);

}//OutprintS

void InputS(HString &s)

{

char ch[80];

printf("input theString:\n");

scanf("%s",ch);

StrAssign(s,ch);

}//InputS

int main()

{

int i,pos=1;

HString t,s;

InitString(s);//由于HSring定义了指针,所以必须初始化

InitString(t);

InputS(s);

InputS(t);

OutprintS(s);

OutprintS(t);

i=Index(s,t,pos);

printf("the location is:%d\n",i);

return 1;

}

六、Brute-Force算法的复杂度分析

最好的情况:算法时间复杂度为:O(Strlen(T));

        最坏的情况:算法时间复杂度为:O(Strlen(S)×Strlen(T))。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hopegrace/article/details/104495312

智能推荐

Matlab如何找出两个矩阵中相同的元素_matlab矩阵相同元素-程序员宅基地

a=[1,2,3,4,5,6,7,8,9];b=[1,4,6,9,12,14];c=intersect(a,b)% c就是a、b中相同的元素 matlab里关于集合运算和二进制数的运算的函数intersect:集合交集ismember :是否集合中元素setdiff :集合差集setxor :集合异或(不在交集中的元素)union :两个集合的并_matlab矩阵相同元素

python实现傅里叶变换_使用Python / Sympy进行连续傅里叶变换(分析解决方案)-程序员宅基地

据我所知,目前没有人正在研究这个问题,尽管contributions are welcome.我可以给出一些建议:>如果在fourier_transform()中设置noconds = False,则包含0为True的条件:In [26]: fourier_transform(cos(t),t,x, noconds=False)Out[26]:⎛ │ ⎛ ..._sympy 傅立叶变换

视频容器和格式-程序员宅基地

1、视频容器格式简介一般而言,视频文件的扩展名就是视频的容器名。比如“avi文件”或者“mp4文件,avi和mp4只是容器格式。好比zip文件,里面可以包含各种文件,视频容器格式只是定义了怎么存储数据,而不论存储什么类型的数据。不过视频容器格式比这个更复杂一些,因为不是所有的视频流格式兼容所有的视频容器格式。 一个视频文件一般包含多个track,而每个视频track(没有音频)又

配置caffe的python接口及其易错点-程序员宅基地

配置caffe的python接口的步骤总结:a.安装依赖库 库的版本要求,在$caffe-root/python中的requirements.txtCython>=0.19.2numpy>=1.7.1scipy>=0.13.2scikit-image>=0.9.3scikit-learn>=0.14.1matplotlib>=1.3.1ipyth

TOM企业邮箱怎么屏蔽垃圾邮件,如何确保企业邮箱安全办公?_为什么tom.com邮箱不能拦截黑名单邮件_贤惠的博客-程序员宅基地

随着越来越多的人使用企业邮箱,很多企业高管每天光接收邮件就要几百封,而且时不时还会收到垃圾邮件的干扰,造成一些重要的客户邮件无法及时锁定错过商家,那么如何确保邮箱安全办公呢?优秀的安全邮箱又是什么样的呢?下面就罗列下安全邮箱的特点!国内或国外的邮件往来,都能实现畅通无阻。强大的反垃圾性能,精准的将各种垃圾及病毒邮件排除在外。安全性方面,采用高级杀毒机制,SS极加密传输,异常情况提前预警。商务办公更便捷,可微信随时收发邮件,语音传输、免费不限量提醒、安全分享等20余项移动办公特权。_为什么tom.com邮箱不能拦截黑名单邮件

vue 实现侧边菜单点击,内容滚动至可视区_sidebar menu内容滑动到元素_逸曦穆泽的博客-程序员宅基地

1、显示图:2、模板内容:<div class="page-container"> <div class="sidebar-menu"> <div class="sidebar-menu-inner"> <nav class="sidebar-nav"> <img class="sidebar-logo" src="../assets/logo.png">._sidebar menu内容滑动到元素

随便推点

带你了解一下霍尔效应传感器编程工具是啥-程序员宅基地

TDK公司 扩展了编程工具链,磁传感器编程器(MSP)V1.0可以方便地对Micronas多种产品编程。MSP V1.0替代APB 1.5 及其他现有的编程工具,其集合了USB-Programming Kit V1.01 和HAL APB V5.1。该编程器特别适用于开发实验室。TDK现在有三款工具支持所有Micronas可编程传感器。新的磁传感器编程器(MSP)V1.0取代APB 1.5,形成..._霍尔传感器编程

模态框(modal)自动居中-程序员宅基地

// modal对用户可见$('.modal').on('shown.bs.modal', function () { modalOnResize(this);})// 浏览器窗口大小改变事件window.onresize = function(){ // 已显示modal var node = $(".modal:visible"); ...

Jquery的Jar包-程序员宅基地

Jquery的资料信息:http://jquery.com/_jquery的jar包

apache用https访问php时直接下载源码文件_#php <filesmatch \.php$> sethandler "proxy:unix:/t-程序员宅基地

attempt to connect to Unix domain socket /tmp/php-cgi-56.sock (*) failedapache用https访问php时直接下载源码文件1.登录Apache服务所在服务器,查看Apache服务的httpd.conf配置文件,确认存在以下配置:LoadModule mime_module modules/mod_mime.so编辑httpd.conf配置文件,使用井号(#)注释或删除该配置。执行以下命令,确认没有报错信息,说明配置文件正常。_#php sethandler "proxy:unix:/tmp/phpwebstudy-php-cgi-80.

MATLAB绘图命令PLOT详解_matlab中plot函数每个线的名称-程序员宅基地

%% 二维绘图与三维绘图%% 二维绘图plot ezplot与匿名函数后面会讲到 stairs()、stem()…clearclcx=0:0.1:2pi;y=sin(x);%% 线形plot(x,y,’-’);%实线plot(x,y,’–’);%虚线plot(x,y,’:’);%点线plot(x,y,’-.’);%点化线%% 线色plot(x,y,‘c-.’);%点化线 ..._matlab中plot函数每个线的名称

matlab expo,人工智能中的深度学习与增强学习-matlabexpo2019.pdf-程序员宅基地

深度学习与强化学习– MATLAB人工智能算法开发马文辉MathWorks 中国 2015 The MathWorks, Inc.1人工智能(A.I., Artificial Intelligence)开发计算机系统或应用以执行通常需要人类智慧的任务2人工智能应用对象分类 语义识别 预测性维护信号分类 ..._matlab expo 2019

推荐文章

热门文章

相关标签