首页 > 编程语言 > 详细

串的顺序表示和匹配(C语言)

时间:2021-04-10 23:13:31      阅读:36      评论:0      收藏:0      [点我收藏+]
#include <stdio.h>
#include <stdlib.h>

const int MAXSIZE = 100;
#define OK 1;
#define ERROR 0;
#define OVERFLOW 0;

typedef int Status;

typedef struct {
    char *ch;
    int length;
}SqString;

//串的初始化
Status InitStr(SqString *str){
    str->ch=(char*)malloc(sizeof(char)*(MAXSIZE+1));
    str->length=0;
    if(!str->ch) return OVERFLOW;  //分配失败 
    return OK;
}

//串赋值
Status StrAssign(SqString *str,char arrChar[],int len){
    int i;
    for(i=1;i<=len;i++){
        str->ch[i]=arrChar[i-1];  //ch[0]空置 
    }
    str->length=len;
    return OK;
}

//串打印 
Status StrPrint(SqString str){
    int i;
    for(i=1;i<=str.length;i++){
        printf("%c",str.ch[i]);
    }
    printf("\n");
    return OK;
}


//串匹配BF算法
int IndexOf_BF(SqString mainStr,SqString subStr){
    int i=1,j=1;
    while(i<=mainStr.length&&j<=subStr.length){
        if(mainStr.ch[i]==subStr.ch[j]) {
            i++;
            j++;
        } else {
            i=i-j+2;  //主串指针回溯到下一轮匹配的第一个字符
            j=1;  //子串指针回溯到1号字符 
        }
    }
    if(j==subStr.length+1) return i-subStr.length;
    return 0;
}


//串匹配KMP算法 
int IndexOf_KMP(SqString mainStr,SqString subStr,int next[]){
    int i=1,j=1;
    while(i<=mainStr.length&&j<=subStr.length){
        if(j==0||mainStr.ch[i]==subStr.ch[j]){
            i++;
            j++;
        } else {
            j=next[j];
        }
    }
    if(j==subStr.length+1) return i-subStr.length;
    return 0;
}
Status get_next(SqString subStr,int next[]){
    int i=1,j=0;
    next[1]=0;
    while(i<subStr.length){
        if(j==0||subStr.ch[i]==subStr.ch[j]){
            i++;
            j++;
            next[i]=j;
        } else {
            j=next[j];
        }
    }
    return OK;
}

//动态分配int型数组的空间,通过实参返回地址 
Status DynamicAllocationArr(int **arr,int size){
    (*arr)=(int*)malloc(sizeof(int)*size);
    if(!(*arr)) return OVERFLOW;
    return OK; 
}

//动态分配int型数组的空间,通过函数返回值返回地址 
int* DynamicAllocationArr2(int *arr,int size){
    arr=(int*)malloc(sizeof(int)*size);
    if(!arr) return OVERFLOW;
    return arr; 
}


int main(void){
    SqString str1;
    
    //初始化 
    Status initStrResult = InitStr(&str1);
    printf("串str1初始化结果码:%d\n",initStrResult);
    
    //串赋值
    char arrChar[]={h,e,l,l,o,w, ,w,o,r,l,d,!};
    int arrLen=sizeof(arrChar)/sizeof(arrChar[0]);
    Status assignStrResult = StrAssign(&str1,arrChar,arrLen);
    printf("串str1赋值结果码:%d\n",assignStrResult);
    printf("主串:");
    StrPrint(str1); 
    
    //朴素匹配 
    SqString str2;  //作为子串(模式串)
    InitStr(&str2);
    char arrChar2[]={r,l,d};
    StrAssign(&str2,arrChar2,sizeof(arrChar2)/sizeof(arrChar2[0]));  //生成有数据的串 
    printf("模式串(子串):");
    StrPrint(str2); 
    int index1=IndexOf_BF(str1,str2);
    if(index1){
        printf("BF-匹配结果地址:%d\n",index1);
    } else {
        printf("匹配失败\n");
    }
    
    //KMP匹配 
    int *next=DynamicAllocationArr2(next,str2.length+1);  //动态分配数组空间 
    get_next(str2,next);  //生成部分匹配表
    int index2=IndexOf_KMP(str1,str2,next);
    if(index2){
        printf("KMP-匹配结果地址:%d\n",index2);
    } else {
        printf("匹配失败\n");
    }
    
    printf("\nEND");
    return 0;
}

技术分享图片

串的顺序表示和匹配(C语言)

原文:https://www.cnblogs.com/petitepluie/p/14641845.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!