【C语言】串的BF与KMP算法匹配

题目:

(P125 T8)
令主串为aaabbbababaabb,子串为abaa,试分别用BF和KMP算法给出其匹配过程,并分析算法时间复杂度。

#include 
#include 
#define MAXLEN 50
typedef struct
{
    char ch[MAXLEN];
    int len;
}SString;

/**给顺序串赋值*/
void Str_Assign(SString *S)
{
    printf("请输入一个顺序串r的长度:");
    int t;
    scanf("%d",&t);
    S->len=t;
    printf("请输入一个顺序串r:");
    for(int i=0;i<t;i++)
    {
        scanf(" %c",&S->ch[i]);/*%c前面必须有空格*/
    }

}

Str_BF(SString *S,SString *t)
{
    int i,j,start;
    if (t->len==0) {printf("子串是空串 \n");return (0);}
    start=0;i=start;j=0;
    while (i<S->len && j<t->len)
    {
        if (S->ch[i]==t->ch[j])
        {
            j++;
            i++;
        }
        else
        {
            start++;
            i=start;
            j=0;
        }
    }
    if (j>=t->len)
    {
        printf("BF匹配成功,匹配起始位置为: \n");
        printf("%d",start+1);
        printf("\n");
        return (start);
    }
    else {printf("BF匹配失败 \n");return (-1);}
}


void Str_Get_next(int *next,SString *s2)
   /**用于构建s2的next数组,kmp的前奏*/
{
    int t1=0,t2;
    next[0]=t2=-1;
    while(t1<s2->len)
    {
        if(t2==-1||s2->ch[t1]==s2->ch[t2])
        {
            next[t1+1]=t2+1;
            t1++;
            t2=t2+1;
        }
        else t2=next[t2];
    }
    printf("NEXT数组构建成功 \n");

}

int Str_KMP(int *next,SString *s1,SString *s2) /**用于判断S2是否是S1的子串*/
{
    int t1=0,t2=0;
    while(t1<s1->len&&t2<s2->len)
    {
        if(t2==-1||s1->ch[t1]==s2->ch[t2])
        {
            t1++;
            t2++;
        }
        else t2=next[t2];
    }
    if(t2==s2->len)
    {
        printf("KMP算法匹配成功 \n");
        return (1);
    }//S2是S1子串
    else
    {
        printf("KMP算法匹配成功 \n");
        return (0);//S2不是S1子串
    }

}



int main()
{
    printf("主串为aaabbbababaabb(长度14),子串为abaa(长度4)\n");
    SString *S;
    Str_Assign(&S);
    SString *r;
    Str_Assign(&r);

    printf("KMP算法 \n");
    int next[MAXLEN];
    printf("\n构建NEXT数组 \n");
    Str_Get_next(next,&r);
    printf("\n构建NEXT数组 \n");
    Str_KMP(next,&S,&r);

    printf("\n");
    printf("BF算法 \n");
    Str_BF(&S,&r);
    return 0;
}

运行情况:
【C语言】串的BF与KMP算法匹配_第1张图片

你可能感兴趣的:(【C语言】串的BF与KMP算法匹配)