串是由零个或多个字符组成的有限序列
定长结构体定义:
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