#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#define Error 0
#define Ok 1
#define MAXSIZE 256
typedef int Status;
typedef struct {
char str[MAXSIZE];
int length;
}SqString; //使用串的顺序存储表示来存储串
Status StrAssign(SqString &T,char chars[],int i){ //生成一个值等于chars的串T
int j;
T.length=0;
j=0;
for(j=0;j<i;j++)
{
T.str[j]=chars[j];
}
T.length=j;
return Ok;
}
int Index(SqString s,SqString T,int pos) //求子串位置的定位函数
{
int i,j=0;
i=pos;
while(i<=s.length-1&&j<=T.length-1)
{
if(s.str[i]==T.str[j])
{
i++;j++; //当主串与子串出现相等的情况的时候,i和j都++,继续查找下一位是不是相同
}
else
{
i=i-j+1;j=0; //当发生不匹配时,指针倒退回第一个匹配的下一位,由于书上的数组0位是记录数组长度的,而我这里从0
//开始存储的串,所以求退回时是i-j+1而不是+2
}
}
if(j>T.length-1) return i-T.length;
else return Error;
}
void print(SqString T) //输出串
{
int i;
for(i=0;i<T.length;i++)
printf("%c",T.str[i]);
printf("\n");
}
void main()
{
SqString s,t;
int pos,i,j,k;
pos=0;
char chars[] ={'a','b','a','b','c','a','b','c','a','c','b','a','b'};
char charss[]={'a','b','c','a','c'};
i=sizeof(chars)/sizeof(char);
j=sizeof(charss)/sizeof(char);
// i=strlen(chars);
StrAssign(s,chars,i);
StrAssign(t,charss,j);
printf("主串为");
print(s);
printf("模式串为");
print(t);
k=Index(s,t,pos);
printf("模式串在主串第几个位置之后匹配%d",k);
getchar();
getchar();
}
这个是串的模式匹配的一般算法,当主串与子串的值相同时,两个指针就向后移,当出现不同时,主串的指针回到第一个相同的地方再加一,子串的指针置为0,直到将子串中的全部找到
串的模式匹配(普通算法)
最新推荐文章于 2022-11-02 10:32:01 发布