数据结构——D/串
一、串的定义和基本操作
1. 串的定义
1)串的概念
- 组成结构: 串是由零个或多个字符组成的有限序列,记为
S=′a1a2⋯an′S='a_1a_2\cdots a_n'S=′a1a2⋯an′
(n≥0n \geq 0n≥0
),其中SSS
是串名,aia_iai
可以是字母、数字或其他字符 - 长度特性: 串中字符的个数
nnn
称为串的长度,n=0n=0n=0
时的串称为空串(用∅\emptyset∅
表示) - 边界符说明: 单引号或双引号只是边界符,不计入串长度(如"Hello World!"长度为11)
- 编程语言差异: Java/C使用双引号,Python使用单引号表示字符串
2)子串
- 定义: 字符串中任意连续字符组成的子序列(包括空串)
- 示例特性: 从主串"iPhone 11 Pro Max"中,"11 Pro"、"Pro"等都是其子串
- 包含关系: 空串是任何字符串的子串
3)字符
- 位置编号: 字符在主串中的位置从1开始计数(与线性表位序一致)
- 空格处理: 空格也是有效字符(如"11 Pro"中空格是第3个字符)
- 存储大小: 每个字符占1字节(8比特),跨考同学需特别注意
4)子串在主串中的位置
- 定位规则: 以子串第一个字符在主串中的位置作为子串位置
- 示例说明: 子串"11 Pro"在主串"iPhone 11 Pro Max"中的位置是8('1'的位置)
5)空串和空格串的区别
- 空串: 长度为零的串(如
M=′′M=''M=′′
) - 空格串: 包含空格字符的串(如
N=' '
长度为3) - 存储差异: 空串不占存储空间,空格串占用与空格数对应的存储空间
2. 串与线性表的区别
- 元素限制:
- 线性表:元素可为任意数据类型
- 串:元素限定为字符(中英文字符、数字、标点等)
- 操作对象:
- 线性表:以单个元素为操作单位
- 串:通常以子串为操作单位(如搜索引擎处理字符串)
- 实际应用: 字符串操作更符合人类语言处理需求(需多个字符组合表达语义)
3. 串的基本操作
1)判空操作
- 实现方式: 判断字符串长度是否为0
- 返回值: 空串返回true,非空返回false
2)销毁串
- 与清空区别:
- 清空:仅逻辑清空,保留存储空间
- 销毁:回收存储空间,不可再次使用
- 内存管理: 销毁操作涉及动态内存释放机制
3)串的连接
- 操作示例:
SSS
="iPhone",WWW
="Pro"连接后TTT
="iPhonePro" - 存储考虑: 频繁连接需设计可扩展的存储结构
4)求子串
-
- 参数指定: 需要起始位置和子串长度
- 边界处理: 需验证参数有效性(如起始位置+长度不超过主串长度)
5)定位操作
- 功能描述: 查找子串在主串中首次出现的位置
- 返回值: 找到返回位置序号(从1开始),未找到返回0
- 算法核心: 依赖子串匹配算法实现
6)比较操作
- 比较规则:
- 逐字符比较ASCII码值
- 先出现较大字符的串更大
- 全相同则较长串更大
- 返回值约定:
-
S>TS>TS>T
返回正值 -
S=TS=TS=T
返回0 -
S<TS<TS<T
返回负值
-
- 字典序原理: 基于字符在编码表中的二进制值比较(如'a'<'o'因ASCII码97<111)
4. 字符集编码
1)字符与二进制数的对应关系
- 存储原理: 计算机只能存储二进制数,所有字符必须通过编码规则转换为二进制形式存储
- 映射关系: 每个字符对应唯一的二进制数,如字母'a'存储为高四位0110加低四位0001的组合
2)ASCII编码示例
- 编码结构: ASCII码使用8位二进制数(1字节)表示,分为非打印控制字符(0-31)和可打印字符(32-127)
- 输入方式: 可通过ALT+小键盘数字键输入,如ALT+65输入大写字母'A'
3)字符比较与二进制数的关系
- 比较机制: 计算机直接比较字符对应的二进制数值大小,如'c'(01100011)>'a'(01100001)
- 实际应用: 英文字典排序本质是二进制数的升序排列
4)空格串与空串的区别
- 空格串: 对应二进制00100000,占用1字节存储空间
- 空串: 无实际字符内容,不占用存储空间(NULL)
5)字符集的概念
- 集合定义: 特定语言所有字符的集合,如ASCII包含英文字母、标点符号等128个字符
- 扩展需求: 中文等语言字符量远超256个,需要更大字符集
6)不同字符集的编码需求
- 容量限制: 8位二进制仅能表示256种状态,无法满足中文需求
- 解决方案: Unicode字符集包含全球文字符号,如中文"任"字需要更长的二进制编码
7)编码规则与字符集映射
- 数学模型: 字符集为定义域(x),编码规则为映射函数(f),二进制数为值域(y)
- 编码方案: 同一字符集可有多种编码规则(如UTF-8、UTF-16),对应不同二进制表示
8)编码方案的选择与字符空间占用
- 空间差异: ASCII每个字符占1字节,UTF-8中文字符占3字节
- 考研重点: 只需掌握英文字符的1字节存储情况
5. 拓展乱码问题
1)乱码问题的产生原因
- 核心原因: 文件存储与读取使用不同编码规则,如存储用
y=f(x)y=f(x)y=f(x)
而读取用y=g(x)y=g(x)y=g(x)
- 实例说明: "码"字在规则A中编码为0101...,在规则B中可能解码为完全不同的字符
2)从函数角度理解乱码问题
- 数学模型: 正确解码需使用原编码规则的反函数
x=f−1(y)x=f^{-1}(y)x=f−1(y)
- 错误本质: 实际使用了错误的逆映射
g−1(y)g^{-1}(y)g−1(y)
导致字符解析失败
3)字符串基本概念回顾
- 术语定义:
- 串长:字符串包含的字符数量
- 子串:主串中连续字符组成的片段
- 位置:字符/子串在主串中的序号(从1开始)
4)字符串比较与字符集编码
- 比较规则: 按字符编码值逐位比较,类似字典序排列
- 操作重点: 子串定位算法(如Index(S,T))是后续学习的核心内容
相关文章:

数据结构——D/串
一、串的定义和基本操作  1. 串的定义   1)串的概念   组成结构: 串是由零个或多个字符组成的有限序列,记为 S′a1a2⋯an′Sa_1a_2\cdots a_nS′a1a2⋯an′&#x…...
瀚文机械键盘固件开发详解:HWKeyboard.cpp文件解析与应用
🔥 机械键盘固件开发从入门到精通:HWKeyboard模块全解析 作为一名嵌入式开发老司机,今天带大家拆解一个完整的机械键盘固件代码。即使你是单片机小白,看完这篇教程也能轻松理解机械键盘的工作原理,甚至自己动手复刻一…...
Nginx+Tomcat负载均衡与动静分离架构
目录 简介 一、Tomcat基础部署与配置 1.1 Tomcat应用场景与特性 1.2 环境准备与安装 1.3 Tomcat主配置文件详解 1.4 部署Java Web站点 二、NginxTomcat负载均衡群集搭建 2.1 架构设计与原理 2.2 环境准备 2.3 Tomcat2配置(与Tomcat1对称) 2.4…...

AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月8日第102弹
从今天开始,咱们还是暂时基于旧的模型进行预测,好了,废话不多说,按照老办法,重点8-9码定位,配合三胆下1或下2,杀1-2个和尾,再杀4-5个和值,可以做到100-300注左右。 (1)定…...
LeetCode--25.k个一组翻转链表
解题思路: 1.获取信息: (1)给定一个链表,每k个结点一组进行翻转 (2)余下不足k个结点,则不进行交换 2.分析题目: 其实就是24题的变题,24题是两两一组进行交换&…...
css | class中 ‘.‘ 和 ‘:‘ 的使用 | 如,何时用 .is-selected{ ... } 何时用 :hover{...}?
省流总结:交互时的短暂视觉反馈 → 用 :hover,状态需要记录或切换 → 用类名如 .is-selected。 🧠 本质区别: 写法触发方式用途&.is-selected依赖 class 切换需要 JavaScript 控制状态,如选中、激活&:hover鼠…...

【第九篇】 SpringBoot测试补充篇
简介 本文介绍了SpringBoot测试中的五项关键技术:测试类专用属性加载、 测试类专用Bean配置、 表现层测试方法、测试类事务回滚控制、配置文件随机数据设置)。这些技术可以有效隔离测试环境,确保测试数据不影响生产环境,同时提供了…...

springcloud SpringAmqp消息队列 简单使用
这期只是针对springBoot/Cloud 在使用SpringAmqp消息队列的时候遇到的坑。 前提 如果没有安装RabbitMQ是无法连接成功的!所以前提是你要安装好RabbitMQ。 docker 安装命令 # 拉取docker镜像 docker pull rabbitmq:management# 创建容器 docker run -id --namera…...

Framework开发之IMS逻辑浅析1--关键线程及作用
关键线程:EventHub,InputReader,InputDispatcher EventHub: 由于Android继承Linux,Linux的思想是一切皆文件,而输入的类型不止一种(触碰,写字笔,键盘等),每种类型都对应一种驱动设备,而每个硬件驱动设备又对应Linux的一个目录文件…...
The Quantization Model of Neural Scaling
文章目录 摘要1引言2 理论3 概念验证:一个玩具数据集3.1 “多任务稀疏奇偶校验”数据集3.2 幂律规模和新兴能力 4 拆解大型语言模型的规模定律4.1 单token损失的分布4.2 单基因(monogenic)与多基因(polygenic)的规模曲…...
数据源指的是哪里的数据,磁盘中还是内存中
在 MyDB 项目中,特别是这段缓存框架代码: T obj getForCache(key);以及它的上下文: AbstractCache 是一个抽象类,内部有两个抽象方法,留给实现类去实现具体的操作: protected abstract T getForCache(lon…...

系统思考:跳出症状看全局
明天将为华为全球采购认证管理部的伙伴们带来一场关于系统思考的深度课程!通过经典的啤酒游戏经营决策沙盘,一起沉浸式体验如何从全局视角看待问题,发现单点最优并不等于全局最优。 这不仅是一次简单的课程,更是一次洞察系统背后…...

DeepSeek R1 V2 深度探索:开源AI编码新利器,效能与创意并进
最近,AI界迎来了一位神秘的“突袭者”——DeepSeek团队悄无声息地发布了其推理模型DeepSeek R1的重磅升级版V2(具体型号R1-0528)。这款基于MIT许可的开源模型,在原版R1的基础上进行了多项令人瞩目的改进,正以其强大的潜…...

surfer15安装
安装文件 安装包和破解文件 安装 破解及汉化 打开软件...
MySQL从入门到DBA深度学习指南
目录 引言 MySQL基础入门 数据库基础概念 MySQL安装与配置 SQL语言进阶 数据库设计与规范化 数据库设计原则 表结构设计 MySQL核心管理 用户权限管理 备份与恢复 性能优化基础 高级管理与高可用 高可用与集群 故障诊断与监控 安全与审计 DBA实战与运维 性能调…...

Python训练营---DAY48
DAY 48 随机函数与广播机制 知识点回顾: 随机张量的生成:torch.randn函数卷积和池化的计算公式(可以不掌握,会自动计算的)pytorch的广播机制:加法和乘法的广播机制 ps:numpy运算也有类似的广播机…...

debian12拒绝海外ip连接
确保 nftables 已安装: Debian 12 默认使用 nftables 作为防火墙框架。检查是否安装: sudo apt update sudo apt install nftables启用并启动 nftables 服务 sudo systemctl enable nftables sudo systemctl start nftables下载maxmind数据库 将文件解…...

70年使用权的IntelliJ IDEA Ultimate安装教程
安装Java环境 下载Java Development Kit (JDK) 从Oracle官网或OpenJDK。推荐选择JDK 11或更高版本。 运行下载的安装程序,按照提示完成安装。注意记录JDK的安装路径(如C:\Program Files\Java\jdk-11.0.15)。 配置环境变量: 右键…...

MySQL的日志
就相当于人的日记本,记录每天发生的事,可以对数据进行追踪 一、错误日志 也就是存放错误信息的 二、二进制日志-binlog 在低版本的MySQL中,二进制日志是不会默认开启的 存放除了查询语句的其他语句 三、查询日志 查询日志会记录客户端的所…...

低功耗高安全:蓝牙模块在安防系统中的应用方案
随着物联网(IoT)和智能家居的快速发展,安防行业正迎来前所未有的技术革新。蓝牙模块作为一种低功耗、高稳定性的无线通信技术,凭借其低成本、易部署和智能化管理等优势,在安防领域发挥着越来越重要的作用。本文将探讨蓝牙模块在安防系统中的应…...
数据库(sqlite)基本操作
数据库(sqlite) 一:简介: 为什么需要单独的数据库来进行管理数据? 数据的各种查询功能数据的备份和恢复花大量时间在文件数据的结构设计和维护上要考虑多线程对数据的操作会涉及到同步问题,会增加很多额…...
【HarmonyOS 5】游戏开发教程
一、开发环境搭建 工具配置 安装DevEco Studio 5.1,启用CodeGenie AI助手(Settings → Tools → AI Assistant)配置游戏模板:选择"Game"类型项目,勾选手机/平板/折叠屏多设备支持 二、游戏引擎核心架构…...
神经元激活函数在神经网络里起着关键作用
神经元激活函数在神经网络里起着关键作用,它能为网络赋予非线性能力,让网络可以学习复杂的函数映射关系。下面从多个方面详细剖析激活函数的作用和意义: 1. 核心作用:引入非线性因素 线性模型的局限性: 假设一个简单…...
[蓝桥杯 2024 国 B] 蚂蚁开会
问题描述 二维平面上有 n 只蚂蚁,每只蚂蚁有一条线段作为活动范围,第 i 只蚂蚁的活动范围的两个端点为 (uix,uiy),(vix,viy)。现在蚂蚁们考虑在这些线段的交点处设置会议中心。为了尽可能节省经费,它们决定只在所有交点为整点的地方设置会议…...
GIT(AI回答)
在Git中,git push 命令主要用于将本地分支的提交推送到远程仓库(如GitHub、GitLab等)。如果你希望将本地分支的改动同步到另一个本地分支,这不是 git push 的设计目的。以下是正确的替代方法: 方法1࿱…...
JAVA学习-练习试用Java实现“TF-IDF算法 :用于文本特征提取。”
问题: java语言编辑,实现TF-IDF算法 :用于文本特征提取。 解答思路: TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用的文本特征提取方法,用于评估一个词语对于一个文件集或一个语料库中的其中一份文件的…...

C++定长内存块的实现
内存池 内存池是指程序预先从操作系统 申请一块足够大内存 ,此后,当程序中需要申请内存的时候,不是直接向操作系统申请,而是 直接从内存池中获取 ; 同理,当 **程序释放内存 **的时候,并不真正将…...
【判断自整除数】2022-4-6
缘由是判断自整除数的,这个我的结果是正确的,但是提交就有运行错误是怎么回事啊-编程语言-CSDN问答 void 自整除数字() {//所谓的自整除数字就是该数字可以整除其每一个位上的数字。 //对一个整数n,如果其各个位数的数字相加得到的数m能整除n,则称n为自…...
使用 Ansible 在 Windows 服务器上安装 SSL 证书系列之二
今天带大家实战一下如何通过ansible在windows 服务器上给iis web site安装证书。 前提条件: 准备一张pfx证书,可以通过openssl工具来生成,具体的步骤请参考帮助文档。一台安装了iis 的windows 服务器 准备inventory文件 [windows] solarwinds ansible_host=20.47.126.72 a…...

Unity使用代码分析Roslyn Analyzers
一、创建项目(注意这里不要选netstandard2.1会有报错) 二、NuGet上安装Microsoft.CodeAnalysis.CSharp 三、实现[Partial]特性标注的类,结构体,record必须要partial关键字修饰 需要继承DiagnosticAnalyzer 注意一定要加特性Diagn…...