串的匹配
长的为主串,短的为模式串。
模式串去遍历主串,找到相对应的匹配位置。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//构造串结构
typedef struct String
{
char* pstr;
int total;//总大小
int cur;//有效元素大小
}String,*PString;
void initString(PString ps)
{
if(ps != NULL)
{
ps->pstr = NULL;
ps->total = ps->cur = 0;
}
}
void strAssign(PString ps,char* p)
{
int i = 0;
int len = strlen(p);//字符串有效长度
if(ps->pstr != NULL)//ptr !NULL 串非空 释放旧空间
{
free(ps->pstr);
}
if(len == 0)//if(!len)//字符串是NULL
{
ps->pstr = NULL;
ps->total = ps->cur = 0;
}
else//字符串非空
{
ps->pstr = (char*)malloc(sizeof(char)*len);
for(i = 0;i< len;i++)
{
ps->pstr[i] = p[i];
}
ps->total = len;
ps->cur = len;
}
}
int BF(PString s,PString p)
{
int i = 0;//遍历主串S
int j = 0;//遍历模式串P
while(i <s->cur && j <p->cur)
{
if(s->pstr[i] == p->pstr[j])
{
j++;
i++;
}
else
{
i = i-j+1;//i下一趟主串需要匹配的位置
j = 0;
}
}
if(j == p->cur)
{
return i-p->cur;
}
return -1;
}
int main()
{
String s;
initString(&s);
strAssign(&s,"ANDABBDDAKJABCBABCD");
String p;
initString(&p);
strAssign(&p,"ABCD");
int index = BF(&s,&p);
printf("index:%d\n",index);
return 0;
}