数据结构学习日记(七)

串(String)---零个或多个任意是符组成的有限序列

 

 

 子串:事中任意个连续字符组成的子序列称为该串的子串

主串:包含子串的串相应地称为主串

字符位置:字符在序列中的序号为该字符在串中的位置

子串位置:子串第一个字符在主串中的位置

空格串:由一个或多个空格组成的串,与空串不同

 

串相等:当且仅当两个串的长度相等并且各个对应位置上的字符都相同时,这两个串才是相等的。

 

 

 

 

串的顺序存储结构:

#define MAXLEN 255

typedef struct{

  char ch[MAXLEN+1];//存储串的一维数组

  int length;//串的当前长度

}SString;

 

 

串的链式存储结构--块链结构:

#define CHUNKSIZE 80//块的大小由用户定义

typedef struct Chunk{

  char ch[CHUNKSIZE];

  struct Chunk *next;

}Chunk

 

typedef struct{

  Chunk *head,*tail;//串的头指针和尾指针

  int curlen;//串的当前长度

}LString;//字符串的块链结构

 

 

 

串的模式匹配算法:确定生串中所含子串(模式串)第一次出现的位置(定位)

 

 

 

BF算法:

匹配失败:

i=i-j+2=2(回溯)

j=1(从头开始)

 

 

 

int Index BF(SString S, SStringT){

  int i = 1,j = 1;

  while(i<=S.length && j<=T.length){

    if(s.ch[i] == t.ch[j]){

      ++i;

      ++j;

}//主串和子串依次匹配下一个字符

    else{

      i=i-j+2;

      j=1;

}//主串、子串指针回溯重新开始下一次匹配

}

  if (j>=T.length) return i-T.length; //返回匹配的第一个字符的下标

  else return 0; //模式匹配不成功

}

 

 

int Index BF(SString S, SStringT,int pos){

  int i = pos,j = 1;

  while(i<=S.length && j<=T.length){

    if(s.ch[i] == t.ch[j]){

      ++i;

      ++j;

}//主串和子串依次匹配下一个字符

    else{

      i=i-j+2;

      j=1;

}//主串、子串指针回溯重新开始下一次匹配

}

  if (j>=T.length) return i-T.length; //返回匹配的第一个字符的下标

  else return 0; //模式匹配不成功

}

算法复杂度O(n*m)

 

 

KMP算法:

利用已经部分匹配的结果而加快模式串的滑动速度,且主串S的指针i不必回溯,可提速到O(n+m)

 

 

 

posted @ 2021-10-21 21:42  aaawfss  阅读(53)  评论(0)    收藏  举报