📄 模式匹配.c
字号:
# include <stdio.h>
# include <stdlib.h>
# define MAX 100
int next[100];/*定义全局变量数组next[]*/
typedef struct
{
char *ch;
int length;
}string;
void creat(string *s) /*创建一个串*/
{
char c;
int i;
for (i=1;(c=getchar())!='\n';i++)
s->ch[i]=c ; /*将输入的字符序列放入串的字符数组中*/
s->length=i-1; /*置串的长度*/
s->ch[i]= '\0';
}
void print(string *s) /*输出串的字符序列*/
{
int i;
for (i=1;s->ch[i]!= '\0';i++)
printf("%c",s->ch[i]);
printf("\n");
}
void clearstring(string *s)
{
if (s->ch) {free(s->ch);s->ch = NULL;}
s->length = 0;
}
void Index1(string *s,string *t)/*朴素的模式匹配算法:返回子串在主串中的位置po,若不存在则返回error*/
{
int i=1,j=1,po;
while (i<s->length+1&&j<t->length+1)
{
if (s->ch[i]==t->ch[j]) {i++;j++;}
else {i=i-j+2;j=1;}
}
if (j>t->length)
{
po=i-t->length;
printf("(朴素)子串的起始位置是k=%d\n",po);
}
else printf("error\n");
}
void get_next(string *t)/*next[]的求解*/
{
int i=1,j=0,k=1;
next[1]=0;
while (i<t->length)
{
if (j==0||t->ch[i]==t->ch[j])
{
i++;
j++;
next[i]=j;
}
else j=next[j];
}
}
int Index2(string *s,string *t)/*KMP模式匹配算法*/
{
int i=1,j=1;
while (i<=s->length&&j<=t->length)
{
if (j==0||s->ch[i]==t->ch[j])
{
i++;
j++;
}
else
{
j=next[j];
}
}
if (j>t->length)
printf("(KMP)子串的起始位置是k=%d\n",i-t->length);
else printf("error");
}
main()
{
string *s,*b;
int i=1;
s=(string *)malloc(sizeof(string));
s->ch=(char *)malloc(100*sizeof(char));
b=(string *)malloc(sizeof(string));
b->ch=(char *)malloc(100*sizeof(char));
printf("输入主串:");
creat(s);
printf("输入匹配串:");
creat(b);
Index1(s,b);
get_next(b);
Index2(s,b);
printf("\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -