【数据结构】24王道考研笔记——串

四、串

串的定义

串(字符串)是由零个或多个字符组成的有限序列。

  • 子串:串中任意个连续的字符组成的子序列
  • 主串:包含子串的串
  • 字符在主串中的位置:字符在串中的序号
  • 子串在主串中的位置:子串的第一个字符在主串中的位置

串的基本操作:

image.png

其中串执行比较操作时,从第一个字符开始往后依次对比,先出现更大字符的串就更大,长串的前缀与短串相同时,长串更大,只有两个串完全相同时,才相等。

串的存储结构

顺序存储

image.png

//顺序存储
#define MAXLEN 255 //预定义最大串长为255
//静态数组
typedef struct {char ch[MAXLEN]; //每个分量存储一个字符int length; //串的实际长度
}SString;
//动态数组
typedef struct {char* ch; //按串长分配存储区,ch指向串的基地址int length; //串的长度
}HString;
//初始化HString S;S.ch = (char*)malloc(MAXLEN * sizeof(char));S.length = 0;return 0;

求子串

//求子串,用Sub返回串S的第pos个字符起长度为len的子串
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;
}

比较操作

//比较操作
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;
}

定位操作

//比较操作
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;
}

链式存储

//链式存储
typedef struct StringNode {char ch; //每个结点存1个字符struct StringNode* next;
}StringNode,*String;
//每个结点存多个字符
typedef struct StringNode2 {char ch[4]; //每个结点存四个字符struct StringNode2* next;
}StringNode2,*String2;

串的模式匹配

朴素模式匹配

时间复杂度为O(mn)

//朴素模式匹配算法
int Index(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算法

先利用模式串T求出next数组,利用next数组进行匹配,使得主串指针不回溯。时间复杂度为O(m+n)

//KMP算法
int Index_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]){++i;++j; //继续比较后继字符}else j = next[j];//模式串向右移动,主串不回溯}if (j > T.length)return i - T.length;//匹配成功elsereturn 0;
}

求next数组

//求next数组
void get_next(SString T, int next[])
{int i = 1, j = 0;next[1] = 0;//初始化while (i, T.length){if (j == 0 || T.ch[i] == T.ch[j]){++i; ++j;next[i] = j;//若pi=pj,则next[j+1]=next[j]+1}elsej = next[j];}
}

改良后求nextval数组

//改良后的nextval数组
void get_nextval(SString T, int nextval[])
{int i = 1, j = 0;nextval[1] = 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;else nextval[i] = nextval[j];}elsej = nextval[j];}
}

主要参考:王道考研课程
后续会持续更新考研408部分的学习笔记,欢迎关注。
github仓库(含所有相关源码):408数据结构笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/18814.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker 里面各种 command not found 总结

一、ip&#xff1a;command not found 执行命令&#xff1a; apt-get update & apt-get install -y iproute2 二、yum&#xff1a;command not found 执行命令&#xff1a; apt-get update & apt-get install -y yum 三、ping&#xff1a;command not found 执行命…

一、简易搭建本地CAS服务端

CAS服务端war包下载 https://repo1.maven.org/maven2/org/apereo/cas/cas-server-webapp-tomcat/5.3.14/ 可使用迅雷下载cas-server-webapp-tomcat-5.3.14.war &#xff0c;速度很快 将wab包放到本地tomcat的webapps下D:\tomcat\apache-tomcat-8.5.63\webapps\cas\WEB-INF\clas…

解决Anaconda第三方库下载慢

1.打开Anconda Prompt&#xff0c;进入后台 2.执行命令第一个是添加一个清华镜像&#xff0c;第二个设置在 conda 显示通道的 URL。 &#xff08;1&#xff09;conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ &#xff08;2&#xff0…

RocketMQ5.0消息存储<四>_刷盘机制

RocketMQ5.0消息存储<四>_刷盘机制 一、刷盘概览 RocketMQ存储与读写是基于JDK NIO的内存映射机制(MappedByteBuffer),消息存储时首先将消息追加到文件内存映射(commit操作),再根据配置的刷盘策略在不同时间进行刷写到磁盘(flush操作)。同步刷盘,消息提交到文件内…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第二十二天 22/50

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

C#核心知识回顾——12.lambda表达式、List排序、协变和逆变

1.Lambda表达式 可以将lambad表达式理解为匿名函数的简写 它除了写法不同外&#xff0c;使用上和匿名函数一模一样 都是和委托或者事件配合使用的 //匿名函数 //delegate&#xff08;参数列表&#xff09; //{ //} //lambda表达式 //(参数列表) > //{ //函数体 //…

【Maven】类或者包提示找不到,报红

背景 使用IDEA&#xff0c;类或者包提示找不到&#xff0c;报红 解决方法 1. maven reload 2. 检查profiles是否对 3. 不要选中offline模式 4. 检查本地仓库位置 5. 清掉idea缓存 6. 到本地maven仓库删掉出错的包然后重新maven reload 7. update本地仓库 8. 排查是不是别人没…

Seata 分布式事务的中间件Seata设计和实现方案

文章目录 分布式事务的中间件SeataSeata AT 模式-默认模式前提整体机制写隔离读隔离 Seata XA 模式前提整体机制工作机制 Seata TCC 模式Seata Saga 模式概述缺点&#xff1a; Saga的实现外传 分布式事务的中间件Seata Seata 是一款开源的分布式事务解决方案&#xff0c;致力于…

Java设计模式之创建型-原型模式(UML类图+案例分析)

目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 1、通用实现&#xff08;浅克隆&#xff09; 2、深克隆 五、总结 一、基础概念 原型模式通过复制已有对象作为原型&#xff0c;通过复制该原型来返回一个新对象&#xff0c;而不是新建对象&#xff0c;说白了…

重磅IntelliJ IDEA 2023.2 新版本即将发布,拥抱 AI

IntelliJ IDEA 近期连续发布多个EAP版本&#xff0c;官方在对用户体验不断优化的同时&#xff0c;也新增了一些不错的功能&#xff0c;尤其是人工智能助手补充&#xff0c;AI Assistant&#xff0c;相信在后续IDEA使用中&#xff0c;会对开发者工作效率带来不错的提升。 以下是…

一个Transformer在尺度上适合多模态扩散的所有分布

文章目录 One Transformer Fits All Distributions in Multi-Modal Diffusion at Scale摘要本文方法实验结果 One Transformer Fits All Distributions in Multi-Modal Diffusion at Scale 摘要 本文提出了一个统一的扩散框架(UniDiffuser)来拟合一个模型中与一组多模态数据相…

【来不及刷题之】43、最小栈(PriorityQueue)

因为要在常量时间内查询出最小值&#xff0c;所以需要有另外的数据结构维护最小值&#xff0c;很自然地想到了“堆”这个结构&#xff0c;“最小堆”的堆顶元素刚好是最小值因此出栈和入栈的同时也要维护好最小堆 class MinStack {PriorityQueue<Integer> heap;LinkedLi…