数据结构-串

目录

一、串的表示和实现

1.定长顺序存储表示

2.堆分配存储表示 

3.串的块链存储表示

二、串的模式匹配算法

1.模式匹配简单算法

(1)时间复杂度分析(好的情况)

(2)时间复杂度分析2(坏的情况) 

 2.模式匹配KMP算法

 (1)KMP算法

(2)求next函数值


一、串的表示和实现

1.定长顺序存储表示

2.堆分配存储表示 

typedef struct{
    char *ch;//若是非空串,则按串长分配存储区;否则ch为NULL
    int length;
}HString;

3.串的块链存储表示

#define CHUNKSIZE 80
typedef struct Chunk{
    char ch[CHUNKSIZE];
    struct Chunk *next;
}Chunk;
typedef struct{
    Chunk*head,*tail;
    int curlen;
}LString;

二、串的模式匹配算法

1.模式匹配简单算法

int Index(SString S,SString T,int pos){
    int i=pos,j=1;
    while(i<=S[0]&&j<=T[0]){
        if(S[i]==T[j]){
            i++;
            j++;
        }else{
            i=i-j+2;//i-j是回到此次比较的第一个元素前一个(i,j都是数组下标所以会多减一个)
                   //再加2是往后挪一位开始比较:加1的话是原来的开始位置,所以要往后再加1也就是加2
            j=1;
        }
    }
    if(j>T[0]) return i-T[0];
    else return 0;

(1)时间复杂度分析(好的情况)

(2)时间复杂度分析2(坏的情况) 

 2.模式匹配KMP算法

根据next数组去判断模式串的哪一位主串当前位进行比较

 (1)KMP算法

int Index_KMP(SString S,SString T,int pos){
    i=pos;
    j=1;
    while(i<=S[0]&&j<=T[0]){
        if(j==0||S[i]==T[j]){//j可能等于0是因为上一次如果是j等于1的话,就会进else语句被赋成0
            i++;
            j++;
        }
        else j=next[j];
    }
    if(j>T[0]) return i-S[0];
    else return 0;
}
     

(2)求next函数值

除了模式串1号位的next值为0,其他的位对应的next值都是最长前(后)缀子串的长度加一

void get_next(SString T,int next[]){//next传引用过来的
    int m=1,n=0'
    next[1]=0;
    while(m<T[0]){
        if(n==0||T[m]==T[n]) next[++m]=++n;//n是上一次模式串第n位的next值,如果第m位和第n位相 
                                           //等就相当于是第m-1位的最长前后缀串的往后再加一位还
                                           //是相等的,所以当前位的next值是上一位的next值也就                        
                                           //是n再加一
        else n=next[n];//迭代,如果新增一位不等,就往前找新的相等的子串
    }
}
    

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值