数据结构与算法基础(王卓)(14):串、数组和广义表(BP、KMP算法)
创始人
2024-05-30 22:02:30
0

串的定义(前置条件):


顺序串:(一般常用)

//基于线性表的定义所做的更改
#include
using namespace std;
#include//存放exit
#include//OVERFLOW,exittypedef int Status;
#define MAXLEN 255struct SString//Sequence String
{char ch[MAXLEN + 1]; //存储串的一维数组int length; //串的当前长度长度
};

链串:

//链串的定义及其基础操作
#include
using namespace std;
#include//存放exit#define CHUNKSIZE 80//块的大小可由用户定义
typedef int Status;         //函数调用状态struct Chunk//厚块; 厚片; 大块;  组块;
{char ch[CHUNKSIZE];Chunk* next;
};struct LString
{Chunk* head, * tail;int curlen;//current length:当前长度
};int main()
{}

基本操作:

(1) :StrAssign (&T,chars)

串赋值

(2): StrCompare(S,T)

串比较

(3) :Strlength (S)

求串长

(4) :Concat(&T,S1,S2)

串连结

(5): SubString(&Sub,S,pos,len)

求子串

(6): StrCopy(&T,s)

串拷贝

(7) :StrEmpty(S)
//串判空

(8) :ClearString (&S)

清空串


(9) :Index(S,T,pos)

//子串的位置


(11) :Replace(&S,T,V)

串替换


(12) :Strlnsert(&S,pos,T)
//子串插入

(12) :StrDelete(&S,pos,len)

//子串删除


(13) :DestroyString(&S)
//串销毁


BF算法:

brute force:蛮力;暴力;强力

int Index_BF(SString S, SString T, int pos)//暴力算法
{int i = pos, 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;//模式匹配不成功}
}

注解:

(1):

index:序号,编号

(物价和工资等的)指数;指标;索引;标志;

vt.:为…编索引;将…编入索引;

(2):

pos:从位置pos(第pos位)开始(向后)检索

(3):

判断(主串和子串有一个串)检索完了跳出循环的语句不是判断内容是否为空

(实际上电脑系统内部可能随机分配数值,即使我们造了一个该类型的空值也无法实际奏效)

而是:    while (i <= S.length && j <= T.length)


KMP(算法):

void get_next(SString T, int next[])
{int i = 1; next[1] = 0; int j = 0;while (i < T.length){if (j == 0 || T.ch[i] == T.ch[j]){++i; ++j;next[j] = j;}elsej = next[j];}
}int Index_KMP(SString S, SString T, int pos)
{int i = pos, j = 1;while (i <= S.length && j <= T.length){if (S.ch[i] == T.ch[j]){++i; ++j;}//主串和子串依次匹配下一个字符else//get_next(T, next[j]);j = next[j];		}if (j > T.length) return i - T.length; //匹配成功else return 0;
}
void get_nextval(SString T, int nextval[])
{int i = 1; nextval[1] = 0; int j = 0;while (i < T.length){if (j == 0 || T.ch[i] == T.ch[j]){++i; ++j;if (T.ch[i] != T.ch[j])nextval[i] = j;elsenextval[i] = nextval[j];}else j = nextval[j];}
}

该算法详细研究过程后续将重新整理,详见:

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...