题目
实现主串为“abacababdeadcde”,模式串为任意输入串得,字符串匹配结果,同时输出模式串得Next数组;
用例1:输入:abab
输出:匹配成功
-1001;
用例2:输入:ababb
输出:匹配未成功
-10012
用例3:deadc
输出:匹配成功
-10001
用例4:输入:abced
输出:匹配未成功
-10000
代码实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void get_pmt(char *p,int *pmt,int len)
{
int i,j=0;
pmt[0]=0;
for(i=1;i<len;)
{
while(p[i]==p[j])
{
pmt[i]=pmt[i-1]+1;
i++;
j++;
}
if(j==0)
{
pmt[i]=0;
i++;
}
else
{
j=pmt[j-1];
}
}
return;
}
int match(char *s,char *p,int *pmt,int s_len,int p_len)
{
int i=0,j=0;
while(i<s_len && j<p_len)
{
while (s[i]==p[j] && j<p_len && i<s_len)
{
i++;
j++;
}
if(j==0)
{
i++;
}
else if(j==p_len) return 1;
else if(i==s_len) return 0;
else
{
j=pmt[j-1];
}
}
return 0;
}
int main()
{
char s[]="abacababdeadcde";
char p[100];
gets(p);
int s_len=strlen(s);
int p_len=strlen(p);
int pmt[100];
memset(pmt,0,sizeof(int)*100);
get_pmt(p,pmt,p_len);
if(match(s,p,pmt,s_len,p_len)) printf("匹配成功\n");
else printf("匹配未成功\n");
int i;
printf("-1");
for(i=1;i<p_len;i++)
{
printf("%d",pmt[i-1]);
}
return 0;
}
算法详解见:
https://zhuanlan.zhihu.com/p/105629613