无回溯匹配模式

#include "stdio.h"
#include "stdlib.h"

struct SeqString {
    int MAXNUM;
    int n;
    char *c;
};

typedef struct SeqString * PSeqString;

 

//创建空顺序串
PSeqString createNullStr_Seq(int m)
{
    PSeqString pstr=(PSeqString)malloc(sizeof(struct SeqString));
    if(pstr!=NULL)
    {
        pstr->c=(char *)malloc(sizeof(char)*m);
        if(pstr->c)
        {
            pstr->n=0;
            pstr->MAXNUM=m;
            return pstr;
        }
        else
        {
            free(pstr);
        }
    }
    printf("out of space! \n");
    return NULL;
}

 

 

//无回溯的模式匹配算法
int pMatch(PSeqString t,PSeqString p,int *next)
{
    //变量next是数组next的第一个元素的next[0]的地址
    int i,j;
    i=0;
    j=0;
    while (i<p->n && j<t->n) 

        if (i==-1 || p->c[i]==t->c[j]) 
        {
            i++;
            j++;
                printf("%c ",p->c[i]);
                printf("%d --",i);
                 printf("%c ",t->c[j]);
                printf("%d   \n",j);

            if (i >=p->n-1) 
            {
                return (j-p->n+1);
            }
            
        }
        else
        {
            i=next[i];
        }
         
    return 0;

}

//计算next数组
int * makeNext(PSeqString p,int *next)
{
    int i=0;
    int k=-1;
    next[0]=-1;
    while (i<p->n-1) 
    {
        while (k>=0 && (p->c[i]!=p->c[k]) )
        {
            k=next[k];
        }
        i++;
        k++;
        if(p->c[i]==p->c[k])
        {
            next[i]=next[k];
        }
        else
        {
            next[i]=k;
        }
        
    }
    
    return *next;
}

 

测试:

int main()
{
    char *c1,*c2;
    int i=0,k;
    int  next[7];
    PSeqString p1,p2;
    
    c1="abceabceabcddabcdabcdefjdkdsfjadflsdkjf";
    c2="adflsd";

    p1=createNullStr_Seq(40);
    p2=createNullStr_Seq(7);
    p1->c=c1;
    p1->n=40;

    p2->c=c2;
    p2->n=7;
    
    *next=makeNext(p2,next);

     for(k=0;k<7;k++)
         printf("%d ",next[k]);

    i=pMatch(p1,p2,next);

    printf("%d",i);
    return 1;
}

 

输出结果:30

posted on 2012-05-08 23:46  yucong  阅读(559)  评论(0)    收藏  举报

导航