4-数据结构-串的学习

4.1串类型的定义

1.串:(或字符串)

串是由多个字符组成的有限序列,记作:S=‘c1c2c3…cn’ (n>0)

其中S是串的名字,‘c1c2c3…cn’ 是串值
ci是串中字符
n是串的长度,表示字符的数目

空串:零个字符的串称为空串,记作“”(空)

2.子串

子串:串中任意连续字符组成的子序列
主串:包含子串的串

注意:空串是任意串的子串,任意串是他自身的子串。除它本身外,一个串的其他子串都是它的真子串

*字符在串中的位置:字符在序列中的序号
*子串在串中的位置:子串的第一个字符在子串中的位置

3.串相等

两个串长度相等且各个对应位置的字符串都相等时才相等

4.空格串

由一个或多个空格组成的串,长度不为0

【串和线性表的区别:
1:数据对象:串的约束对象为字符集
2 串的操作:线性表大多以“单个元素”为操作对象;串通常以“串的整体”作为操作对象

4.2.1串的表示和实现

【1.定长顺序存储表示
*静态分配:为每个串预先分配一个固定长度的存储区域

*用定长数组描述
#define MAXSTRLEN 255 //最大串长
typedef unsigned char SString[MAXSTRLEN+1]
// +1个单元为 0号单元存放串的长度

【图】在这里插入图片描述

【串的连接:

status Concat(SSting&T,SString S!,SString S2)
{//用T返回由S1和S2连接而成的新串。若未截断,则返回TURE,否则返回FALSEif(S1[0]+S2[0]<=MAXSTRLEN)\
{//未截断T[1,...,S1[10]]=S1[1,....S1[0]];       //S1[0]表示S1的0号单元,里面是串的长度  T[S1[0]+1,...,S2[0]+S2[0]];T[0]=S1[0]+S2[0];   //长度之和uncut=TURE;   //未截断
}else if(S1[0]<MAXSTRSIZE) 
{//截断T[1,...,S1[10]]=S1[1,....S1[0]];      T[S1[0]+1,...,MAXSTRLEN]=S2[1,...,MAXSTRLEN-S1[0] ];    //装不下,只截取了S2的一部分T[0]=MAXSTRLEN;  uncut=FALSE;  
}return uncat;
} //Concat
}

【求子串:

status SubString(SString &Sub,SString S,int pos,int len)
{//用sub返回串的第pos个字符起长度为len的子串//其中,1<=pos<=StrLength(S) 且0<=len<=StrLength(S)-pos+1if (pos<1||pos>S[0]||len<0||len>S[0]-pos+1)return ERROR;   //不合法Sub[1..len]=S[pos..pos+len-1];   //从S的第pos位置开始,取长度为len的子串
Sub[0]=len;    //子串的长度
return OK;}

【总结:
操作特点:
1.实现串操作特点的原操作为:“字符序列的复制”
2.在操作中当出现串的长度超过MAXSTRLEN时,约定用截断法处理

4.2.2串的表示和实现

2.堆分配存储表示

动态分配

仍以一组地址连续的存储单元存放串值字符序列,但存储空间是在程序执行过程中动态分配而得的,也称为【动态存储分配的顺序表】。用malloc()和free()来分配和释放

堆分配的存储表示
typedef struct 
{char *ch;    //地址指向存储空间 按需分配//若是非空串,则按串实用长度分配存储区,否则ch为NULLint lentgh;   //串长度} HString;    
串插入
status strInsert(HString &S,int pos,HString T)
//在串S的第pos个位置前插入串T
{ int i;if(pos<1||pos>S.length+1)    //判断合法范围return ERROR;if(T.length)            //判断是否为0{if(!(S.ch=(char*)realloc(S.ch,(S.length+T.length)*sizeof(char))))    //S和T的长度之和exit(OVERFLOW);    //分配失败溢出for(i=S.length-1;i>=pos-1;--1)     //length-1是节点序数,因为长度有一个0节点{ S.ch[i+T.length]=S.ch[i];}for(i=0;i<=T.length-1;i++)S.ch[pos-1+i]=T.ch[i];S.length+=T.length;}return OK;
}
求串长

int StrLength(HString S)
//求串长
{return S.length
}
串比较

int StrCompare(HString S,HString T)
//比较两个串,若相等返回0
{int i;for (i=0;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;
}
串清空
status ClearString(HString &S)
//将S清空为空串
{if(S.ch){free(S.ch);S.ch=NULL;}S.length=0;return OK;
}
串连接
status Concat(HString &S,HString S1,HString S2){
int j;
if(!(S.ch=(char*)malloc((S1.length+S2.length)*sizeof(char))))exit(OVERFLOW);
for (j=0;j<=S1.length-1;j++){S.length=S1.length+S2.length;}
for(j=0;j<=S2.length-1;j++){  S.ch[S1.length+j]=S2.ch[j];}
return OK;
}
求子串
status StubString(HString &Sub,HString S,int pos,int len)
// 用Sub返回串S的dipos个字符开始长度为len的子串
{if(pos<1||pos>S.length||len<0||len>S.length-pos+1)return ERROR;if(!len) {Sub.cn=NULL;Sub.length=0;}else{sub.ch=(char*)malloc(len*sizeof(char));for(int j=0;j<=len-1;j++){Sub.ch[j]=S.ch[pos-1+j];}
Sub.length=len;
}
return OK;

4.3串的模式匹配算法

4.3.1 BF算法
模式匹配:

在这里插入图片描述
在这里插入图片描述

算法:
int Index(SString S,SString T,int pos)
{
i=pos;j=1;
while(i<=S[0]&&j<=T[0])  //判断合法范围{if(S[i]==T[j]) {++i;++j;}else{i=i-j+2; j=1;}}
if(j>T[0])  return i-T[0];
else return 0;
}
时间复杂度:

最好情况:
在这里插入图片描述
最坏情况:
在这里插入图片描述

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

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

相关文章

Linux下rm误删恢复 extundelete

Linux下rm误删恢复 extundelete 误删之后要第一时间卸载&#xff08;umount&#xff09;该分区&#xff0c;或者以只读的方式来挂载&#xff08;mount&#xff09;该分区&#xff0c;否则覆写了谁也没办法恢复。如果误删除的是根分区&#xff0c;最好直接断电&#xff0c;进入…

5-数据结构-数组的学习

5.1数组的定义 定义&#xff1a; 由一组类型相同的数据元素构成的有序集合&#xff0c;每个数据元素称为一个数据元素&#xff08;简称元素&#xff09;&#xff0c;每个元素受n&#xff08;n>1&#xff09;个线性关系的约束&#xff0c;每个元素在n个线性关系中的序号i1、…

timm 视觉库中的 create_model 函数详解

timm 视觉库中的 create_model 函数详解 最近一年 Vision Transformer 及其相关改进的工作层出不穷&#xff0c;在他们开源的代码中&#xff0c;大部分都用到了这样一个库&#xff1a;timm。各位炼丹师应该已经想必已经对其无比熟悉了&#xff0c;本文将介绍其中最关键的函数之…

C--数据结构--树的学习

6.2.1二叉树的性质 1.二叉树 性质&#xff1a; 1.若二叉树的层次从1开始&#xff0c;则在二叉树的第i层最多有2^(i-1)个结点 2.深度为k的二叉树最多有2^k -1个结点 &#xff08;k>1&#xff09; 3.对任何一颗二叉树&#xff0c;如果其叶结点个数为n0,度为2的非叶结点个数…

TVM:使用 Schedule 模板和 AutoTVM 来优化算子

TVM&#xff1a;使用 Schedule 模板和 AutoTVM 来优化算子 在本文中&#xff0c;我们将介绍如何使用 TVM 张量表达式&#xff08;Tensor Expression&#xff0c;TE&#xff09;语言编写 Schedule 模板&#xff0c;AutoTVM 可以搜索通过这些模板找到最佳 Schedule。这个过程称为…

TVM:使用 Auto-scheduling 来优化算子

TVM&#xff1a;使用 Auto-scheduling 来优化算子 在本教程中&#xff0c;我们将展示 TVM 的 Auto-scheduling 功能如何在无需编写自定义模板的情况下找到最佳 schedule。 与基于模板的 AutoTVM 依赖手动模板定义搜索空间不同&#xff0c;auto-scheduler 不需要任何模板。 用…

C语言—sort函数比较大小的快捷使用--algorithm头文件下

sort函数 一般情况下要将一组数从的大到小排序或从小到大排序&#xff0c;要定义一个新的函数排序。 而我们也可以直接使用在函数下的sort函数&#xff0c;只需加上头文件&#xff1a; #include<algorithm> using namespace std;sort格式&#xff1a;sort(首元素地址&…

散列的使用

散列 散列简单来说&#xff1a;给N个正整数和M个负整数&#xff0c;问这M个数中的每个数是否在N中出现过。 比如&#xff1a;N&#xff1a;{1,2,3,4}&#xff0c;M{2,5,7}&#xff0c;其中M的2在N中出现过 对这个问题最直观的思路是&#xff1a;对M中每个欲查的值x&#xff0…

关于C++中的unordered_map和unordered_set不能直接以pair作为键名的问题

关于C中的unordered_map和unordered_set不能直接以pair作为键名的问题 在 C STL 中&#xff0c;不同于有序的 std::map 和 std::set 是基于红黑树实现的&#xff0c;std::unordered_map 和 std::unordered_set 是基于哈希实现的&#xff0c;在不要求容器内的键有序&#xff0c…

AI编译器与传统编译器的联系与区别

AI编译器与传统编译器的区别与联系 总结整理自知乎问题 针对神经网络的编译器和传统编译器的区别和联系是什么&#xff1f;。 文中提到的答主的知乎主页&#xff1a;金雪锋、杨军、蓝色、SunnyCase、贝壳与知了、工藤福尔摩 笔者本人理解 为了不用直接手写机器码&#xff0…

python学习1:注释\变量类型\转换函数\转义字符\运算符

python基础学习 与大多数语言不同&#xff0c;python最具特色的就是使用缩进来表示代码块&#xff0c;不需要使用大括号 {} 。缩进的空格数是可变的&#xff0c;但是同一个代码块的语句必须包含相同的缩进空格数。 &#xff08;一个tab4个空格&#xff09; Python语言中常见的…

Python、C++ lambda 表达式

Python、C lambda 表达式 lambda函数简介 匿名函数lambda&#xff1a;是指一类无需定义标识符&#xff08;函数名&#xff09;的函数或子程序。所谓匿名函数&#xff0c;通俗地说就是没有名字的函数&#xff0c;lambda函数没有名字&#xff0c;是一种简单的、在同一行中定义函…

python 学习2 /输入/ 输出 /列表 /字典

python基础学习第二天 输入输出 xinput("输入内容") print(x)input输出&#xff1a; eval :去掉字符串外围的引号&#xff0c;按照python的语法执行内容 aeval(12) print(a)eval输出样式&#xff1a; 列表 建立&#xff0c;添加&#xff0c;插入&#xff0c;删去…

Linux、Mac 命令行快捷键

Linux、Mac 命令行快捷键 Linux 命令行编辑快捷键&#xff0c;参考了好多个&#xff0c;应该算是比较全的了&#xff0c;Linux 和 Mac 的都有&#xff0c;笔者本人比较常用的也已经红色标出来了&#xff0c;如有错误或遗漏&#xff0c;欢迎留言指出。 光标移动及编辑&#xff…

Python 命令行传参

Python 命令行传参 说到 python 命令行传参&#xff0c;可能大部分人的第一反应就是用 argparse。的确&#xff0c;argparse 在我们需要指定多个预设的参数&#xff08;如深度学习中指定模型的超参数等&#xff09;时&#xff0c;是非常有用的。但是如果有时我们只需要一个参数…

快速排序 C++

快速排序 C 本文图示借鉴自清华大学邓俊辉老师数据结构课程。 快速排序的思想 快速排序是分治思想的典型应用。该排序算法可以原地实现&#xff0c;即空间复杂度为 O(1)O(1)O(1)&#xff0c;而时间复杂度为 O(nlogn)O(nlogn)O(nlogn) 。 算法将待排序的序列 SSS 分为两个子…

Linux命令行下感叹号的几个用法

Linux命令行下 " ! " 的几个用法 ! 在大多数编程语言中表示取反的意思&#xff0c;但是在命令行中&#xff0c;他还有一些其他的神奇用法。熟练掌握这些用法&#xff0c;可以大大提高我们日常命令行操作的效率。 1 执行历史命令 !! ! 在命令行中可以用来执行历史…

三地址码简介

三地址码简介 三地址码&#xff08;Three Address Code&#xff09;是一种最常用的中间语言&#xff0c;编译器可以通过它来改进代码转换效率。每个三地址码指令&#xff0c;都可以被分解为一个四元组&#xff08;4-tuple&#xff09;的形式&#xff1a;&#xff08;运算符&am…

llvm与gcc

llvm与gcc llvm 是一个编译器&#xff0c;也是一个编译器架构&#xff0c;是一系列编译工具&#xff0c;也是一个编译器工具链&#xff0c;开源 C11 实现。 gcc 相对于 clang 的优势&#xff1a; gcc 支持更过语言前端&#xff0c;如 Java, Ada, FORTRAN, Go等gcc 支持更多地 …

攻防世界web新手区解题 view_source / robots / backup

1**. view_source** 题目描述&#xff1a;X老师让小宁同学查看一个网页的源代码&#xff0c;但小宁同学发现鼠标右键好像不管用了。 f12查看源码即可发现flag 2. robots 题目描述&#xff1a;X老师上课讲了Robots协议&#xff0c;小宁同学却上课打了瞌睡&#xff0c;赶紧来教教…