加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

实验    顺序串的各种模式匹配运算

(2012-10-06 13:37:27)

顺序串的各种模式匹配运算

编写一个程序,实现顺序串的各种模式匹配运算,并在此基础上完成如下功能:

(1)建立“abcabcdabcdeabcdefabcdefg”目标串s和“abcdeabcdefab”模式串t。

(2)采用简单匹配算法求t在s中的位置。

(3)由模式串t求出next值和nextval值。

(4)采用KMP算法求t在s中的位置。

(5)采用改进的KMP算法求t在s中的位置。

 

 

 

#include<stdio.h>
#include<string.h>
#include<malloc.h>

#define MaxSize 100

typedef struct {
    char data[MaxSize];     //定义可容纳MaxSize个字符的空间
    int length;             //标记当前实际串长
}SqString;

void StrAssign(SqString &str,char cstr[]){  //由串常量cstr创建串str
    int i;
    for(i=0;cstr[i]!='\0';i++)
        str.data[i]=cstr[i];
    str.length=i;
}

void DispStr(SqString s){   //输出串s的所有元素
    int i;
    if(s.length>0){
        for(i=0;i<s.length;i++)
            printf("%c",s.data[i]);
        printf("\n");
    }
}

int Index(SqString s,SqString t){       //简单匹配算法
    int i=0,j=0,k;
    while(i<s.length && j<t.length){
        if(s.data[i]==t.data[j]){   //继续匹配下一个字符
            i++;
            j++;
        }else{      //主串、子串指针回溯重新开始下一次匹配
            i=i-j+1;
            j=0;
        }
    }
    if(j>=t.length)
        k=i-t.length;       //返回匹配的第一个字符的下标
    else
        k=-1;       //模式匹配不成功
    return k;
}

void GetNext(SqString t,int next[]){    //由模式串t求出next值
    int j,k;
    j=0;
    k=-1;next[0]=-1;
    while(j<t.length-1){
        if(k==-1 || t.data[j]==t.data[k]){
            j++;
            k++;
            next[j]=k;
        }else
            k=next[k];
    }
}

void GetNextval(SqString t,int nextval[]){      //由模式串t求出nextval值
    int j=0,k=-1;
    nextval[0]=-1;
    while(j<t.length){
        if(k==-1 || t.data[j]==t.data[k]){
            j++;
            k++;
            if(t.data[j]!=t.data[k])
                nextval[j]=k;
            else
                nextval[j]=nextval[k];
        }else
            k=nextval[k];
    }
}

int  KMPIndex(SqString s,SqString t){       //KMP算法
    int next[MaxSize],i=0,j=0,v;
    GetNext(t,next);
    while(i<s.length && j<t.length){
        if(j==-1 || s.data[i]==t.data[j]){
            i++;
            j++;
        }else
            j=next[j];  //i不变,j后退
    }
    if(j>=t.length)
        v=i-t.length;       //返回匹配模式串的首字符下标
    else
        v=-1;       //返回不匹配标志
    return v;
}

int KMPIndex1(SqString s,SqString t){   //改进的KMP算法
    int nextval[MaxSize],next[MaxSize],i=0,j=0,v;
    GetNextval(t,next);
    GetNextval(t,nextval);
    while(i<s.length && j<t.length){
        if(j==-1 || s.data[i]==t.data[j]){
            i++;
            j++;
        }else
            j=nextval[j];
    }
    if(j>=t.length)
        v=i-t.length;       //返回匹配模式串的首字符下标
    else
        v=-1;
    return v;
}

int main(){
    int j;
    int next[MaxSize],nextval[MaxSize];
    SqString s,t;
    StrAssign(s,"abcabcdabcdeabcdefabcdefg");
    StrAssign(t,"abcdeabcdefab");
    printf("串s:");DispStr(s);
    printf("串t:");DispStr(t);
    printf("简单匹配P算法:\n");
    printf("  t在s中的位置=%d\n",Index(s,t));
    GetNext(t,next);        //由模式串t求出next值
    GetNextval(t,nextval);  //由模式串t求出nextval值
    printf("    ");
    for(j=0;j<t.length;j++)
        printf("M",j);
    printf("\n");
    printf("t[j]   ");
    for(j=0;j<t.length;j++)
        printf("L",t.data[j]);
    printf("\n");
    printf("next   ");
    for(j=0;j<t.length;j++)
        printf("M",next[j]);
    printf("\n");
    printf("nextval");
    for(j=0;j<t.length;j++)
        printf("M",nextval[j]);
    printf("\n");
    printf("KMP算法:\n");
    printf("  t在s中的位置=%d\n",KMPIndex(s,t));
    printf("改进的KMP算法:\n");
    printf("  t在s中的位置=%d\n",KMPIndex1(s,t));
    return 0;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有