【数据结构】串(String)
文章目录知识架构相关代码知识架构相关代码#include <iostream>using namespace std;/*** 1. 串定义*///1. 静态数组#define MAXLEN 255typedef struct {char ch[MAXLEN];int length;}SString;// 2. 动态typedef struct {char *ch;int length
·
知识架构
相关代码
#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]
}
}
}

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