数据结构:串(String)【详解】

【数据结构】 串 串抽象数据类型=逻辑结构+基本运算(运算描述)串的基本运算如下。 阅读详情
AI摘要

本文介绍了串的基本概念,包括定长顺序存储、堆分配存储和块链存储三种串的存储结构。重点讨论了KMP算法,详细解析了其原理和优化方法,包括部分匹配值、next数组和nextval数组的计算,以提高字符串模式匹配的效率。

友情链接:数据结构专栏

串

【知识框架】

在这里插入图片描述

一、串的定义

串( string)是由零个或多个字符组成的有限序列,又名叫字符串。
一般记为: S = ′ a 1 a 2 . . . a n ′ ( n > = 0 ) S='a_1a_2...a_n '(n>=0) S=′a1​a2​...an′​(n>=0)。
其中, S S S是串名,单引号括起来的字符序列是串的值; a n a_n an​ 可以是字母、数字或其他字符;串中字符的个数 n n n称为串的长度。
另外还有一些其它概念:

  • 空串: n = 0 n=0 n=0时的串称为空串。
  • 空格串:是只包含空格的串。注意它与空串的区别,空格串是有内容有长度的,而且可以不止一个空格。
  • 子串与主串:串中任意个数的连续字符组成的子序列称为该串的子串,相应地,包含子串的串称为主串。
  • 子串在主串中的位置就是子串的第一个字符在主串中的序号。

串的逻辑结构和线性表极为相似,区别仅在于串的数据对象限定为字符集。在基本操作上,串和线性表有很大差别。线性表的基本操作主要以单个元素作为操作对象,如查找、插入或删除某个元素等;而串的基本操作通常以子串作为操作对象,如查找、插入或删除一个子串等。

二、串的存储结构

1、定长顺序存储表示

类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值的字符序列。在串的定长顺序存储结构中,为每个串变量分配一个固定长度的存储区,即定长数组。

#define MAXLEN 255	//预定义最大串长为255
typedef struct{
	char ch[MAXLEN];	//每个分量存储一个字符
	int length;	//串的实际长度
}SString;

串的实际长度只能小于等于MAXLEN,超过预定义长度的串值会被舍去,称为截断。串长有两种表示方法: 一是如上述定义描述的那样,用一个额外的变量len来存放串的长度;二是在串值后面加一一个不计入串长的结束标记字符“\0”,此时的串长为隐含值。
在一些串的操作(如插入、联接等)中,若串值序列的长度超过上界MAXLEN,约定用“截断”法处理,要克服这种弊端,只能不限定串长的最大长度,即采用动态分配的方式。

2、堆分配存储表示

堆分配存储表示仍然以一组地址连续的存储单元存放串值的字符序列,但它们的存储空间是在程序执行过程中动态分配得到的。

typedef struct{
	char *ch;	//按串长分配存储区,ch指向串的基地址
	int length;	//串的长度
}HString;

在C语言中,存在一一个称之为“堆”的自由存储区,并用malloc()和free()函数来完成动则返回一个指向起始地址的指针,作为串的基地址,这个串由ch指针来指示;若分配失败,则返回NULL。已分配的空间可用free()释放掉。
上述两种存储表示通常为高级程序设计语言所采用。块链存储表示仅做简单介绍。

3、块链存储表示

类似于线性表的链式存储结构,也可采用链表方式存储串值。由于串的特殊性(每个元素只有一个字符),在具体实现时,每个结点既可以存放一个字符, 也可以存放多个字符。每个结点称为块,整个链表称为块链结构。图(a)是结点大小为4 (即每个结点存放4个字符)的链表,最后一个结点占不满时通常用“#”补上;图(b)是结点大小为1的链表。
在这里插入图片描述

三、串的基本操作

  • StrAssign(&T, chars): 赋值操作。把串T赋值为 chars
  • Strcopy(&T, S): 复制操作。由串S复制得到串T。
  • StrEmpty(S): 判空操作。若S为空串,则返回TRUE,否则返回 FALSE
  • StrCompare(S,T): 比较操作。若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0。
  • StrEngth(S): 求串长。返回串S的元素个数
  • Substring(&Sub,S,pos,1en):求子串。用Sub返回串S的第pos个字符起长度为len的子串。
  • Concat(&T,S1,S2): 串联接。用T返回由S1和S2联接而成的新串。
  • Index(S,T): 定位操作。若主串S中存在与串T值相同的子串,则返回它在主串S中第一次出现的位置;否则函数值为0
  • Clearstring(&S): 清空操作。将S清为空串
  • Destroystring(&S): 销毁串。将串S销毁
    不同的高级语言对串的基本操作集可以有不同的定义方法。在上述定义的操作中,串赋值StrAssign、串比较 StrCompare、求串长 Strength、串联接 Concat及求子串 Substring五种操作构成串类型的最小操作子集,即这些操作不可能利用其他串操作来实现;反之,其他串操作(除串清除 Clearstring和串销毁 Destroystring外)均可在该最小操作子集上实现。
    例如,可利用判等、求串长和求子串等操作实现定位函数 Index(S,T)。
int Index(Sring S, String T){
	int i = 1, n = StrLength(S), m = StrLength(T);
	String sub;
	while(i <= n-m+1){
		SubString(sub, S, i, m);	//取主串第i个位置,长度为m的串给sub
		if(StrCompare(sub, T) != 0){
			++i;
		}else{
			return i;	//返回子串在主串中的位置
		}
	}
	return 0;	//S中不存在与T相等的子串
}

四、串的模式匹配(重点)

1、简单的模式匹配算法

子串的定位操作通常称为串的模式匹配,它求的是子串(常称模式串)在主串中的位置。这里采用定长顺序存储结构,给出一种不依赖于其他串操作的暴力匹配算法。

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;
	}
}

下图展示了模式串 T = ′ a b c a c ′ T = 'abcac' T=′abcac′和主串 S S S的匹配过程
在这里插入图片描述

简单的模式匹配算法的最坏时间复杂度为 O ( n m ) O(nm) O(nm),其中 n n n和 m m m分别为主串和模式串的长度。

2、KMP算法

在上面的简单匹配中,每趟匹配失败都是模式后移一位再从头开始比较。而某趟已匹配相等的字符序列是模式的某个前缀,这种频繁的重复比较相当于模式串在不断地进行自我比较,这就是其低效率的根源。
因此,可以从分析模式本身的结构着手,如果已匹配相等的前缀序列中有某个后缀正好是模式的前缀,那么就可以将模式向后滑动到与这些相等字符对齐的位置,主串i指针无须回溯,并继续从该位置开始进行比较。而模式向后滑动位数的计算仅与模式本身的结构有关,与主串无关。

KMP算法的特点就是:仅仅后移模式串,比较指针不回溯。很是牛掰。

(1)字符串的前缀、后缀和最大公共前后缀长度

要了解子串的结构,首先要弄清楚几个概念:前缀、后缀和部分匹配值。前缀指除最后一个字符以外,字符串的所有头部子串;后缀指除第一个字符外,字符串的所有尾部子串;部分匹配值则为字符串的前缀和后缀的最大公共前后缀长度。下面以 ′ a b a b a ′ ' ababa' ′ababa′为例进行说明

  • ′ a ′ 'a' ′a′ 的前缀和后缀都为空集最大公共前后缀长度长度为0。
  • ′ a b ′ 'ab' ′ab′ 的前缀为 { a } \{a\} {a} ,后缀为 { b } , { a } ∩ { b } = N U L L \{b\}, \{a\}∩\{b\}=NULL {b},{a}∩{b}=NULL,最大公共前后缀长度长度为0。
  • ′ a b a ′ 'aba' ′aba′ 的前缀为 { a , a b } \{a,ab\} {a,ab}, 后缀为 { a , b a } , { a , a b } ∩ { a , b a } = { a } \{a,ba\}, \{a,ab\}∩\{a,ba\} =\{a\} {a,ba},{a,ab}∩{a,ba}={a}, 最大公共前后缀长度长度为1
  • ′ a b a b ′ 'abab' ′abab′ ,前缀∩后缀, { a , a b , a b a } ∩ { b , a b , b a b } = { a b } \{a, ab, aba\} ∩\{b, ab ,bab\}=\{ab\} {a,ab,aba}∩{b,ab,bab}={ab},最大公共前后缀长度长度为2。
  • ′ a b a b a ′ 'ababa' ′ababa′ ,前缀∩后缀, { a , a b , a b a , a b a b } ∩ { a , b a , a b a , b a b a } = { a , a b a } \{a, ab, aba, abab\} ∩ \{ a, ba, aba, baba\}=\{ a, aba\} {a,ab,aba,abab}∩{a,ba,aba,baba}={a,aba}, 公共元素有两个,最大公共前后缀长度长度为3。

故字符串 ′ a b a b a ′ 'ababa' ′ababa′的最大公共前后缀长度为00123。
这个值有什么作用呢?
回到最初的问题,主串为 ′ a b a c a b c a c b a b ′ 'abacabcacbab' ′abacabcacbab′,子串为 ′ a b c a c ′ 'abcac' ′abcac′。
利用上述方法容易写出子串 ′ a b c a c ′ 'abcac' ′abcac′的最大公共前后缀长度为00010,将最大公共前后缀长度值写成数组形式,就得到了最大公共前后缀长度(Partial match,PM)的表。
在这里插入图片描述
下面用PM表来进行字符串匹配:
在这里插入图片描述
第一趟匹配过程:
发现 c c c与 a a a不匹配,前面的2个字符 ′ a b ′ 'ab' ′ab′是匹配的,查表可知,最后一个匹配字符 b b b对应的部分匹配值为0,因此按照下面的公式算出子串需要向后移动的位数:
移动位数 = 已匹配的字符数 − 对应最大公共前后缀长度 移动位数=已匹配的字符数 - 对应最大公共前后缀长度 移动位数=已匹配的字符数−对应最大公共前后缀长度
因为 2 − 0 = 2 2-0=2 2−0=2,所以将子串向后移动2位,如下进行第二趟匹配:
在这里插入图片描述
第二趟匹配过程:
发现 c c c与 b b b不匹配,前面4个字符 ′ a b c a ′ 'abca' ′abca′是匹配的,最后一个匹配字符a对应的部分匹配值为1, 4 − 1 = 3 4-1=3 4−1=3,将子串向后移动3位,如下进行第三趟匹配:
在这里插入图片描述
第三趟匹配过程:
子串全部比较完成,匹配成功。整个匹配过程中,主串始终没有回退,故KMP算法可以在 O ( n + m ) O(n + m) O(n+m)的时间数量级上完成串的模式匹配操作,大大提高了匹配效率。

(2)对算法的改进方法

使用部分匹配值时,每当匹配失败,就去找它前一个元素的部分匹配值,这样使用起来有些不方便,所以将PM表右移一位,这样哪个元素匹配失败,直接看它自己的部分匹配值即可。将上例中字符串 ′ a b a c ′ ' abac' ′abac′的PM表右移一位,就得到了next数组:
在这里插入图片描述
有时为了使公式更加简洁、计算简单,将next数组整体+1。因此,next数组就变成:
在这里插入图片描述
最终得到子串指针变化公式 j = n e x t [ j ] j=next[ j ] j=next[j]。
next[ j ]的含义是:在子串的第j个字符与主串发生失配时,则跳到子串的next[ j ]位置重新与主串当前位置进行比较。

通过分析,可以知道,除第一个字符外,模式串中其余的字符对应的next数组的值等于其最大公共前后缀长度加上1

n e x t [ j ] = 最大公共前后缀长度 + 1 next[ j ] = 最大公共前后缀长度 + 1 next[j]=最大公共前后缀长度+1

科学的推导得出以下公式:
在这里插入图片描述
通过科学推论,我们可以写出求next数组的程序如下:

void get_next(String T, int *next){
	int i = 1, j = 0;
	next[1] = 0;
	while (i < T.length){
		if(j==0 || T.ch[i]==T.ch[j]){	//ch[i]表示后缀的单个字符,ch[j]表示前缀的单个字符
			++i; ++j;
			next[i] = j;	//若pi = pj, 则next[j+1] = next[j] + 1
		}else{
			j = next[j];	//否则令j = next[j],j值回溯,循环继续
		}
	}
}

与next数组的求解相比,KMP算法就简单许多,和简单模式匹配算法很相似:

int Index_KMP(String S, String T){
	int i=1, j=1;
	int next[255];	//定义next数组
	get_next(T, next);	//得到next数组
	while(i<=S.length && j<=T.length){
		if(j==0 || S.ch[i] == T.ch[j]){	//字符相等则继续
			++i; ++j;
		}else{
			j = next[j];	//模式串向右移动,i不变
		}
	}
	if(j>T.length){
		return i-T.length;	//匹配成功
	}else{
		return 0;
	}
}
(3)KMP算法的进一步优化

前面定义的next数组在某些情况下尚有缺陷,还可以进-步优化。如图4.7 所示,模式 ′ a a a a b ′ ' aaaab ' ′aaaab′在和主串 ′ a a a b a a a a a b ′ ' aaabaaaaab ' ′aaabaaaaab′进行匹配时:
在这里插入图片描述
显然后面3次用一个和p4相同的字符跟S4比较毫无意义,必然失配。
比较毫无意义。那么如果出现了这种类型的应该如何处理呢?
如果出现了,则需要再次递归,将 n e x t [ j ] next[j] next[j]修正为 n e x t [ n e x t [ j ] ] next [next[j]] next[next[j]],直至两者不相等为止,更新后的数组命名为nextval。计算next数组修正值的算法如下,此时匹配算法不变。

void get_nextval(String T, int *nextval){
	int i = 1, j = 0;
	nextval[1] = 0;
	while (i < T.length){
		if(j==0 || T.ch[i]==T.ch[j]){	//ch[i]表示后缀的单个字符,ch[j]表示前缀的单个字符
			++i; ++j;

			if(T.ch[i] != T.ch[j]){	//若当前字符与前缀字符不同
				nextval[i] = j;	//则当前的j为nextval在i位置的值
			}else{
				//如果与前缀字符相同
				//则将前缀字符的nextval值给nextval在i位置上的值
				nextval[i] = nextval[j];
			}
		}else{
			j = nextval[j];	//否则令j = next[j],j值回溯,循环继续
		}
	}
}

总结改进过的KMP算法,它是在计算出next值的同时,如果a位字符与它next值指向的b位字符相等,则该a位的nextval就指向b位的nextval值,如果不等,则该a位的nextval值就是它自己a位的next的值。
这块逻辑很简单,有了next数组,我们很容易就能推导出它的nextval数组了。


附录

上文链接

数据结构:栈和队列

下文链接

数据结构:树

专栏

数据结构专栏

参考资料

1、严蔚敏、吴伟民:《数据结构(C语言版)》
2、程杰:《大话数据结构》
3、王道论坛:《数据结构考研复习指导》
4、托马斯·科尔曼等人:《算法导论》

数据结构---串(结构体实现) 目录 顺序串及其基本运算的实现 链串及其基本运算的实现 串的模式识别 BF算法(简单粗暴)  KMP算法 改进的KMP算法 串(string)是由零个或多个字符组成的有限序列。kong'chuan是任何串的子串 串中所含字符的个数称为该串的长度。一般情况下,英文字母、数字和常用的变电符号以及空格符都是合法的字符。 两个串相等当且仅当它们的长度相等并且各对应位置上的字符都相同。 ... 阅读详情

相关推荐

C语言数据结构第4章--串string的学习

串的抽象数据类型 Data: 串数据集合表示为{ a0,a1,… ai-1,ai,ai+1,…an-1} ,每个数据元素的数据类型为char 。 Operation: (1) StrAssign(T, chars):chars是字符串常量,生成一个其值等于chars的串T。 (2) StrCopy(T , S):由串S复制得串T。 (3) StrEmpty(S):若S为空,返回Tru...

ZUCK的博客 551

数据结构——串

串的定义、基本操作、存储结构、模式匹配(朴素模式匹配算法、KMP算法)

FREEDOM’s blog 5279

【C++实战篇】串的三种存储结构:定长存储、堆分配存储、块链存储

本文介绍了字符串的三种存储方式及其连接实现:定长顺序存储通过固定长度数组存储字符串,但存在截断风险;堆分配存储动态分配内存空间,可灵活调整;块链存储采用链表结构,通过增加节点存储字符数提高存储密度。文章分别展示了三种存储方式下字符串连接的具体实现代码,其中定长存储通过数组拷贝实现连接,堆存储动态分配内存空间,块链存储则通过链表节点操作完成连接。这三种方法各有优劣,适用于不同场景,为字符串处理提供了多样化的解决方案。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1万+

数据结构---串(整个部分)

串基本概念:串是由零个或者多个字符组成的有限序列,一半记作S='a1,a2,a3,a4.......'(n>=0,串的长度)1.S == 串的名字 n == 串当中字符串的个数,称为串的长度。1.空串(null string):长度为零的串,它不包含任何字符。2.空格串(black string) :任由一个或多个空格组成的串,长度大于等于13.子串(sub string):串中任意个连续字符的组成的子序列称为该串的“子串”

weixin_63032791的博客 4321

SAP S/4HANA 可扩展性 – 面向初学者的简化指南

可扩展性(Extensibility)是 SAP ECC 和 SAP S/4HANA 的一项关键功能。它使客户能够通过定制其业务流程来创造竞争优势,并使合作伙伴能够通过量身定制的解决方案来丰富核心 ECC 或 S/4HANA。在过去的几十年中,SAP 的 on-premise 版本客户和合作伙伴主要使用经典的 ABAP 扩展性来扩展他们的 ERP 解决方案。经典扩展性允许 ABAP 开发人员使用甚至修改所有 SAP 对象。尽管经典扩展性非常强大和灵活,但在当今的云世界中,它已不再是一个好的选择。

SAP学习成长之路的博客 1809

Spec-Kit实战:用‘规范驱动开发’重构一个老旧Node.js项目(避坑指南)

本文详细介绍了如何使用Spec-Kit工具通过‘规范驱动开发’(SDD)重构老旧Node.js项目。从逆向工程提取规范到增量改造策略,再到避免典型陷阱,提供了实战指南和避坑技巧,帮助开发者高效实现架构现代化,显著提升代码质量和维护效率。

weixin_42525582的博客 554

数据结构---串

这里我们需要掌握几个概念,串,串名,串长,子串,主串,字符在主串中的位置,子串在主串中的位置(从1开始的),空串,空格串(每个空格字符占1B)。比如S1=”I am a student” S2=”student”子串S2在S1中的位置是8。普通的线性表存放的数据类型是不限制的,而串存放的一般是字符,比如中文字符,英文字符,串的操作对象一般是子串。比如搜索引擎中我们一般输入的是字符串。a在字母表中的位置是小于o的,但是对于计算机来说,字符在计算机中的存储是二进制,这就涉及到字符集编码的问题。

zzqingyun的博客 1479

模拟CMOS 第2章 MOS器件物理基础

模拟CMOS 第2章 MOS器件物理基础 文章目录模拟CMOS 第2章 MOS器件物理基础2.1 基本概念2.1.1 MOSEFT开关2.1.2 MOSEFT结构2.1.3 MOS符号2.2 MOS的I/V特性2.2.1 阈值电压2.2.2 I/V特性的推导2.3 二级效应2.4 MOS器件模型2.4.1 MOS器件版图2.4.2 MOS器件电容2.4.3 MOS小信号模型2.4.4 MOS SPICE模型2.4.5 NMOS与PMOS器件的比较2.4.6 长沟道器件与短沟道器件的比较附录A 用作电容器MO

椰子奶糖的博客 5199

数据结构篇——串(String)

串(string)是由零个或多个字符组成的有限序列,也是一种内容受限的线性表。其特殊性体现在数据元素是一个字符。其中,S是串的名,双引号内元素的个数为串的长度,0个元素的串被称为空串,其长度为0;字符串中的“空格”也算是串的一个元素,当一个串的元素只有空格时,这个串称为“空格串”2.2、子串以及串相等的条件在一个串中,任意几个连续字符所组成的序列称之为该串的子串,包含子串的串叫做主串。子串在主串中的位置通常用子串的第一个字符在主串中的位置表示。

2301_79702677的博客 2069

Burp Suite手工验证CORS漏洞的四步闭环法

CORS(跨域资源共享)是Web应用实现跨域通信的基础机制,其安全本质在于服务端对Origin头的校验逻辑与响应头组合的语义一致性。当服务端错误地返回Access-Control-Allow-Origin: *并配合Access-Control-Allow-Credentials: true,或采用弱校验(如字符串包含匹配)时,将导致敏感数据泄露与凭据劫持风险。该漏洞难以被自动化扫描器发现,因其依赖请求上下文、认证状态及动态策略判断。Burp Suite作为核心工具,需通过构造跨域请求、捕获预检响应、交叉验

weixin_30596343的博客 512

差分逻辑电平——LVDS、CML、LVPECL、HCSL互连

首先了解差分逻辑电平结构,也包括单端逻辑电平常见的逻辑电平_常用的逻辑电平-优快云博客注:ECL >> PECL >> LVPECL演变而来;QDR(Quad Data Rate):四倍数据倍率本文章只涉及差分逻辑电平:LVDS 、LVPECL、CML (高速)(最常用)在任何给定的系统设计中,必须设计驱动器侧和接收器侧之间的时钟逻辑转换。通过在它们之间增加衰减电阻和偏置电路来将一个差分时钟转换为其他类型的差分逻辑,来衰减摆幅电平并重新偏置共模输入接收器。

weixin_45365488的博客 4万+

【数据结构】5.1串String

串是一种特殊的线性表,只是它的组成元素都是字符。其与普通线性表的区别在于,串更加注重"整体性",即其基本操作通常以整体为操作对象.1.S为串名2.串长 :这个串中有五个元素,串长为5要注意串长可以为0 ,即存在空串3.子串和主串若S为主串,则它的字串包括但不限于 “”(空串),"a","ab","cde",abced";这与集合的只是有点像,子集中总是包括空集和它本身,但是这个子串要注意顺序,就是它是从主串中截取的,字符的顺序和主串中是完全一致的;比如“cba"就不是子串了4.子串位置。

qq_65173003的博客 1001

从零开始:TexLive(Latex)安装与配置全指南

本文提供了一份详尽的TexLive(Latex)安装与配置全指南,旨在帮助用户从零开始快速搭建LaTeX工作环境。内容涵盖从镜像下载、安装步骤详解、环境验证到高效编辑器(如VS Code)配置,并特别强调了中文排版支持与宏包管理,确保用户能顺利处理学术论文等专业文档的排版需求。

weixin_29284885的博客 903

数据结构:串(String)知识总结

串是由零个或多个字符组成的有限序列。记为:`S = ‘a₁ a₂ … aₙ’`(n ≥ 0)。它是一种特殊的线性表,其数据元素限定为字符。双(单)引号不是串的一部分,是串的定界符。

zzy_wqe的博客 1015

AgentScope Java 入门:Spring AI Alibaba 与 AgentScope 的定位与区别

摘要:Spring AI Alibaba是阿里基于Spring AI开发的本地化AI应用框架,旨在服务Java开发者。它提供模型接入、函数调用、RAG等功能,并与阿里云基础设施深度集成。同时,阿里开源了多智能体框架AgentScope,其Java版(AgentScope-Java)专注于Agentic设计理念。两者将协同发展:Spring AI Alibaba侧重Spring生态集成,AgentScope-Java强化智能体能力。未来计划包括支持AgentScope、升级Admin平台,以及推进Server

SmartSi 1532

MIKE 21 教程 1.5 基于卫星影像绘制河道边界

上一节讲解了如何输入高程数据与绘制网格本节讲解如何根据卫星影像绘制河道边界。在实际项目中,经常遇到河道图纸缺少的情况,此时可以根据卫星影像进行勾勒绘制。常用的地理信息软件均可完成此功能,这里使用大家较为熟悉的ArcGis进行教学(本文默认大家有基础ArcGis操作知识,如有不懂可留言)。

Hello Word 3282

数据结构10————串-从c语言String库源码来学习

数据结构学习笔记7————串-从c语言String库源码来学习一.前言 在学习串这一章的时候老师,讲的挺快的。基本只是讲了串的定义,有哪些基本操作。还有串的两种匹配模式。 在学习串的基本操作时,发现好多操作在c语言的String库里都有提供。所以很好奇,在c语言的String库中,这些基本操作都是如何实现的。所以在网上查了一些资料。在博客的后面就是String库中,串基本操作的实现

冰炭不投day的博客 1762

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

数据结构-----串(String)详解

前面我们学习了顺序表和线性表,这两种数据结构的储存数据域可以是一个任意类型,比如:整形、字符串类型、含有多种类型的结构体等等……那今天我们学习新的数据结构--串,其数据域的类型只能是字符类型,下面就一起来看看吧!串是由零个或多个字符数组组成的有限序列。串中字符的个数称为串的长度,含有零个元素的叫空串。串是限定了元素为字符的线性表(注:串与一般的线性表操作有很大区别,线性表主要针对表内的某个元素,而串操作主要针对子串。

m0_73633088的博客 3312

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【数据结构】串(String)

本文章介绍数据结构中的串的基本知识,包括串的顺序存储结构和模式匹配(BP和KMP),且还包含一些课后习题(附有解析)。此外,含有关于串的全部具体实现代码

2201_75475240的博客 1308

【数据结构】串(string)的定义与表示

#笔记整理 串(string)(或字符串) 是由零个或多个字符组成的有限序列,一般记为 s=′a1a2…an′s=&#x27;a_1a_2…a_n&#x27;s=′a1​a2​…an′​。 串的定长顺序存储表示(定长顺序串) 定长顺序串的存储分配是在编译时完成的。与前面所讲的线性表的顺序存储结构类似, 用一组地址连续的存储单元存储串的字符序列。 #define MAXSTRLEN ...

自律带来自由 2110

【数据结构】四、串:串string、模式匹配BF\KMP、广义表

串,即**字符串 ( String)**是由零个或多个**字符**组成的有限序列。一般记为S = 'a1a2……an'(n ≥ 0) 其中, S 是**串名**,**单引号**括起来的**字符序列**是串的值。 ai 可以是字母、数字或其他字符。 串中字符的个数 n 称为**串的长度**。n = 0时的串称为**空串**(用Ø表示)。 例:(单双引号都有) S = "Helloworld!" T = 'this is a string'

关注:https://github.com/Suhan42 1419

数据结构中的串(String):概念、操作和实际应用

在计算机科学中,串 是由零个或多个字符组成的有限序列,是数据结构中常见的一种基本类型。它可以为空串,也可以是由字符组成的非空串。串通常用于表示文本数据,如文件内容、用户输入等,因此在算法和程序设计中占据着重要的地位。一个串可以是由字母、数字、符号等任意字符组成,字符的种类和个数没有固定限制。例如,"Hello, World!@#$%" 都是串的例子。串的重要性在于它是对文本数据进行处理和操作的基础,涉及字符串匹配、文本编辑、编译器设计等多个领域。因此,深入理解串的特性和操作对于程序设计人员至关重要。

JAZJD的博客 1947

大话数据结构--串string

dingxingmei的专栏 713

大话数据结构12 串String

基础内容 串的操作: 串的比较 代码 #include "string.h" #include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 40 /* 存储空间初始分配量 */ typedef int Sta

weixin_42376458的博客 188

【数据结构】(四)串 String

字符串

张林克的博客 228

【数据结构】串_String

#include "string.h" #include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE

博客 2585
上一篇: 数据结构:栈和队列(Stack & Queue)【详解】
下一篇: 数据结构:树(Tree)【详解】
UniqueUnit
博客等级 码龄9年 4万+粉丝 15原创
评论 23
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值