【数据结构】串(String)


知识架构

在这里插入图片描述


相关代码

#include <iostream>
using namespace std;

/**
 * 1. 串定义
 */

//1. 静态数组
#define MAXLEN 255
typedef struct {
    char ch[MAXLEN];
    int length;
}SString;

// 2. 动态
typedef struct {
    char *ch;
    int length;
}HString;

//3. 链式存储
//存储密度低
/*typedef struct StringNode{
    char ch;
    struct StringNode *next;
}StringNode, *String;*/
//存储密度高
typedef struct StringNode{
    char ch[4];
    struct StringNode *next;
}StringNode, *KString;

/**
 * 基本操作实现
 */

//1.求子串
bool SubString(SString &Sub,SString S,int pos,int len){
    if (pos+len-1 > S.length){ //太长
        return false;
    }

    for (int i = pos; i < pos+len; ++i) {
        Sub.ch[i-pos+1] = S.ch[i];
    }
    Sub.length = len;
    return true;
}

//2. 串的比较
int StrCompare(SString S,SString T){
    for (int i = 1; i <= S.length && i <= T.length ; ++i) {
        if (S.ch[i] != T.ch[i]){
            return S.ch[i]-T.ch[i];
        }
    }
    //前面字符全相同
    return S.length - T.length;
}

//3. 求串在主串中的位置
int Index(SString S,SString T){
    int i = 1;
    int n = S.length;
    int m = T.length;
    SString sub;
    while (i < n-m+1){
        SubString(sub,S,i,m);
        if (StrCompare(sub,T) !=0 ){
            i++;
        } else {
            return i;
        }
    }

    return 0;

}



//4. 朴素模式匹配算法
int Index2(SString S,SString T){
    int i = 1, j = 1;
    while (i <= S.length && j <= T.length){
        if (S.ch[i] == T.ch[j]){
            i++;
            j++;
        } else {
            i = i - j +2;  //注意这里
            j = 1;
        }
    }
    if (j > T.length){
        return i-T.length;
    } else {
        return 0;
    }
}


// KMP算法

int kmp(SString S,SString T,int next[]){
    int i = 1,j = 1;//分别指向主串和模式串的第一个元素
    while (i <= S.length && j <= T.length){
        if (j == 0 || S.ch[i] == T.ch[j]){
            //j=0表示第一个就匹配失败,主串向下移一个, 模式串变成第一个,继续比较
            //匹配成功,都向下移一位继续比较
            i++;
            j++;
        } else {
            //匹配失败,模式串移动到next[j],继续比较
            j = next[j];
        }
    }

    if (j > T.length){
        return i - S.length;
    } else {
        return 0;
    }
}

//求next数组
void get_next(SString T,int next[]){
    int i = 1; //指向T的第i个
    int j = 0; //next[i]的值
    next[1] = 0;
    //已知Pi求P(i+1)
    while (i < T.length){
        if (j == 0 ||T.ch[i] == T.ch[j]){
            //Pi=P(next[i]),则n[i+1]=next[i]+1;
            //j == 0 表示不存在相等,直接next[i+1]=1
            i++;
            j++;
            next[i] = j;
        } else {
            //Pi不等于P(next[i]),则比较Pi与P(next[next[j]])
            j = next[j]; //pi不等于pj,j=next[j]
        }
    }
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值