是由零个或多个字符组成的有限序列

定长结构体定义:

typedef struct
{
  char str[maxSize+1];
  int length;
}Str;

变长结构体定义(需要使用malloc分配空间)

typedef struct
{
  char *ch;
  int length;
}Str;

赋值操作

int strassign(Str& str,char* ch)
{
  if(str.ch)
    free(str.ch);
  int len=0;
  char *c=ch;
  while(*c)
  {
    ++len;
    ++c;
  }
  if(len==0)
  {
    str.ch=NULL;
    str.length=0;
    return 1;
  }
  else
  {
    str.ch=(char*)malloc(sizeof(char) * (len+1));//len+1是为了放'\0'
    if(str.ch==NULL)
      return 0;
    else
    {
      c=ch;
      for(int i=0;i<=len;++i,++c)//使用<=是为了将ch最后的‘\0’复制到新串
        str.ch[i]=*c;
      str.length=len;
      return 1;
    }
  }
}

串连接

int concat(Str& str,Str str1,Str str2)
{
  if(str.ch)
  {
    free(str.ch);//释放原串空间
    str.ch=NULL;
  }
  str.ch=(char*)malloc(sizeof(char)*(str1.length+str2.length+1));
  if(str.ch==NULL)
    return 0;
  int i=0;
  while(i<str1.length)
  {
    str.ch[i]=str1.ch[i];
    ++i;
  }
  int j=0;
  while(j<=str2.length)//用<=是因为要复制str2的'\0'
  {
    str.ch[i+j]=str2.ch[j];
    ++j;
  }
  str.length=str1.length+str2.length;
  return 1;
}

 

求子串

int substring(Str& substr,Str str,int pos,int len)
{
  if(pos<0||pos>str.length||len<0||len>str.length-pos)
    return 0;
  if(substr.ch)
  {
    free(substr.ch);
    substr.ch=NULL;
  }
  if(len==0)
  {
    substr.ch=NULL;
    substr.length=0;
    return 1;
  }
  else
  {
    substr.ch=(char*)malloc(sizeof(char)*(len+1));
    int i=pos;
    int j=0;
    while(i<pos+len)
    {
      substr.ch[j]=str.ch[i];
      ++i;
      ++j;
    }
    substr.ch[j]='\0';
    substr.length=len;
    return 1;
  }
}

串清空

int clearstring(Str& str)
{
  if(str.ch)
  {
    free(str.ch);
    str.ch=NULL;
  }
  str.length=0;
  return 1;
}

简单模式匹配

int index(Str str,Str substr)
{
  int i=1,j=1,k=i;
  if(str.ch[i]==substr.ch[j])
  {
    ++i;
    ++j;
  }
  else
  {
    j=1;
    i=++k;//匹配失败 i从主串下一位置开始
  }
  if(j>substr.length)
    return k;
  else return 0;
}

Kmp

不匹配时 仅移动模式串 比较指针不回溯

不匹配时 比较指针的位置前面 有公共前后缀 则直接移动至下一个最长公共前后缀(不能为指针左面全部)

 

 

 

公共前后缀长度为N   N+1号位与主串当前位比较

 

 

 

void getnext(Str substr,int next[])//求出next数组
{
  int i=1,j=0;//从下标1开始存储
  next[1]=0;
  while(i<substr.length)
  {
    if(j==0||substr.ch[i]==substr.ch[j])
    {
      ++i;
      ++j;
      next[i]=j;
    }
    else
    {
      j=next[j];
    }
  }
}

int KMP(Str str,Str substr,int next[])
{
  int i=1,j=1;
  while(i<=str.length && j<=substr.length)
  {
    if(j==0||str.ch[i]==substr.ch[j])
    {
      ++i;
      ++j;
    }
    else
    {
      j=next[j];
    }
  }
  if(j>substr.length)
  {
    return i-substr.length;
  }
  else
  {
    return 0;
  }
}

 

 


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

引用:

https://mp.weixin.qq.com/s/bM35bFS8iJ_MSRYH4hZ3uQ