文章目录


知识架构

在这里插入图片描述


相关代码

#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]
        }
    }
}


Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐