第四章 串

news/2025/12/9 22:09:29/文章来源:https://www.cnblogs.com/eulbo-1018/p/18344330

串的定义和实现

串的基本概念

串的定义

串,即字符串,是由零个或多个字符组成的有限序列,一般记为

\[S='a_{1}a_{2}a_{3}...a_{n}'(n\ge0) \]

其中,S是串名,单引号括起来的字符序列是串的值,\(a_{i}\)可以是字母、数字或其他字符:串中字符的个数n称为串的长度,\(n=0\)时的串称为空串(用\(\emptyset\)表示)

  • 子串:串中任意个连续的字符组成的子序列(子串在主串中的位置用子串的第一个字符在主串中的位置来表示)
  • 主串:包含子串的串
  • 字符在主串中的位置:字符在串中的序号
  • 空格串:由一个或多个空格组成的串称为空格串,其长度为串中空格字符的个数

当两个串的长度相等且每个对应位置的字符都相等时,称这两个串是相等的

串是一种特殊的线性表,数据元素之间呈线性关系

串的数据对象限定为字符集

串的基本操作。如增删改查等通常以子串为操作对象

串的实现

串的存储结构

定长顺序存储表示

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

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

串的实际长度只能小于或等于MaxSize,超过预定长度的串值会被舍去,称为截断

堆分配存储表示

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

typedef struct {char *ch;int length;
} HString;

块链存储表示

由于串的特殊性(每个元素只有一个字符),在具体实现时3,每个结点既可以存放一个字符,又可以存放多个字符。每个结点称为块,整个链表称为块链结构

image

串的基本操作

StrAssign(&T,chars)//复制操作,把串T赋值为chars

StrCopy(&T,S)//复制操作,由串S复制得到串T

StrEmpty(S)//判空操作,若S为空串,则返回true,否则返回false

StrLength(S)//求串长,返回串S的元素的个数

SubString(&Sub,S,pos,len)//求子串,用Sub返回串S的第pos个字符起长度为len的子串

ClearString(&S)//清空操作,将串S清空为空串

DestroyString(&S)//销毁串,将串S销毁(回收存储空间)

Concat(&T,S1,S2)//串联接,用T返回由S1和S2联接而成的新串

Index)(S,T)//定位操作,若主串S中存在与串T相同的子串,则返回它在主串S中的第一次出现的位置,否则函数值为0

StrCompare(S,T)//比较操作,若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0(逐个字符比较ASCII码)、

基本操作的实现

求子串

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

串的模式匹配

在主串中找到模式串相同的子串,并返回其所在的位置

简单的模式串匹配算法(朴素模式匹配算法)

将主串中所有长度为m的子串依次与模式串对比,直到找到一个完全匹配的子串,或所有的子串都不必配为止

若当前子串匹配失败,则返回主串指针i指向下一个子串的第一个位置,模式串指针j回到模式串的第一个位置

缺点:当某些子串与模式串能部分匹配时,主串的扫描指针经常回溯,导致时间开销增加

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 + 1;j = 1;}}if (j > T.length) {return i - T.length;} else {return 0;}
}

这主串长度为n,模式串长度为m,则最坏时间复杂度为O(nm)

串的模式匹配算法——KMP算法

串的前缀:包含第一个字符,且不包含最后一个字符的子串

串的后缀:包含最后一个字符,且不包含第一个字符的子串

部分匹配值则为字符串的浅灰和后缀的最长相等前后的长度

KMP算法:当子串和模式串不匹配时,主串指针i不回溯,模式串指针j=next[j]

算法平均时间复杂度:O(n+m)

next数组手算方法:当第j个字符匹配失败,由前1~j-1个字符组成的串记为S,则:next[j]=S的最长相等前后缀长度+1

next[1]=0

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

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

相关文章

数据采集第四次作业-102302128吴建良

作业1:基于 Selenium 和 MySQL 的股票数据爬取 码云仓库:https://gitee.com/wujianliang9/2025-data-collection/tree/master/第四次作业/作业1 一、核心代码与方法 (Code & Methodology) 核心代码 以下是实现爬…

102302142罗伟钊第四次作业

作业1: - 要求: ▪ 熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内 容。 ▪ 使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、 “深证A股”3个板块的股票数据信息。 ▪…

北京SAT辅导机构选课指南:高分攻略与机构测评(2025最新) - 品牌测评鉴赏家

北京SAT辅导机构选课指南:高分攻略与机构测评(2025最新)一、选机构先看 “硬指标”:三大核心维度帮你筛出优质选项 (一)师资实力:实考经验 + 教研能力是提分 “双保险” 真正懂 SAT 的老师,不仅要会教,更要 “…

第四次作业-何玮鑫

作业4 一、沪深 A 股数据爬取:Ajax 动态数据抓取与结构化存储 1.1 实现方案与核心代码 需求背景与整体思路 本次任务核心目标是爬取东方财富网沪深 A 股、上证 A 股、深证 A 股三大板块的股票数据,解决Ajax 动态加载…

[ABC212D] Querying Multiset 题解

[ABC212D] Querying Multiset 题解[ABC212D] Querying Multiset Description 给你一个集合,让你支持三种操作:将 \(x\) 加入集合。把集合中的数都加上 \(x\)。将集合中最小的数删除,并且输出这个数。Solution 考虑使…

P4105 [HEOI2014] 南园满地堆轻絮 题解

P4105 [HEOI2014] 南园满地堆轻絮 题解P4105 [HEOI2014] 南园满地堆轻絮 Description 给你一个长度为 \(n\) 的正整数序列 \(a\),让你构造一个单调不降的正整数序列 \(b\),使得下面式子的值尽量小。 \[\max_{i=1}^{n…

【树莓派】【v4l2】在树莓派环境下取流-编码-存储

硬件环境:树莓派3B+ Camera模块:rpi Camera(500像素) 编码库:x264 工程代码 #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <string.h> #include <fcntl.h>…

Daily Report — Day 4 (Beta)

Daily Report — Day 4 (Beta) 📅 日期:2025/12/05 👥 参与人:zc、lzy、shr ✅ 昨日完成工作(Day 3 落地成果)单元测试体系落地(CI 集成完成)完成 Jest + TS 环境配置,成功挂载至 GitHub Actions 流水线; …

[ABC241D] Sequence Query 题解

[ABC241D] Sequence Query 题解[ABC241D] Sequence Query Description 有一个空序列 \(a\)。给定 \(q\) 次操作,每次询问是以下三种之一:1 x:向 \(a\) 中插入元素 \(x\)。 2 x k:输出 \(a\) 中所有 \(\le x\) 的元…

Prometheus + Grafana 原理和用法

Prometheus + Grafana 原理和用法(通俗易懂版) 我们可以把这个组合想象成 「智能体检中心」:Prometheus = 体检医生:主动上门,定期采集服务器/应用的“健康数据”(CPU、内存、接口响应时间等),并把数据存起来。…

2025年度不锈钢板直销优质厂家TOP榜单盘点,不锈钢中厚板/201不锈钢板/不锈钢热轧板/不锈钢板现货批发哪家好 - 品牌推荐师

随着制造业的转型升级与基建投资的稳步推进,不锈钢板作为重要的工业与建筑原材料,其市场需求持续增长,对供应商的产品品质、供应能力及综合服务提出了更高要求。面对市场上众多的不锈钢板直销厂家,如何选择一家可靠…

12.09

今天上午没课下午上了一节英语

2025年市场技术好的不锈钢热轧板生产厂家怎么选择,304不锈钢冷热轧板材/316L不锈钢冷热轧板材定制加工有哪些 - 品牌推荐师

随着高端制造业的持续升级,不锈钢热轧板作为船舶、高铁、重型装备等领域的关键基础材料,其市场需求与技术门槛同步提升。面对市场上众多的供应商,如何甄选出技术实力扎实、产品稳定可靠的生产厂家,成为采购决策中的…

完整教程:浏览器工作原理大揭秘:从输入网址到看到页面的奇妙旅程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

什么是API?一文让你彻底搞明白! - 智慧园区

API作为软件应用程序间的通信桥梁,对产品经理至关重要。懂API能助您高效沟通、拓展产品能力,还可通过API盈利。本文解析API核心组成要素,助您在产品设计中巧妙运用。 什么是API? API,英文全称是Application Prog…

Troubleshooting一定要逻辑严谨与逻辑自洽

Troubleshooting一定要逻辑严谨与逻辑自洽2025-12-09 21:55 潇湘隐者 阅读(0) 评论(0) 收藏 举报Oracle数据库升级到19.28版本后,我们的监控就比较频繁收到一类告警邮件,提示告警日志中出现下面这类告警信息: 202…

企业微信相关文档

整理了企业微信开发相关资源文档,包括企业微信开发者官方文档、WxJava开源项目地址及其企业微信模块(weixin-java-cp)的API文档,以及开发者整理的在线文档,同时提供了企业微信管理后台登录入口。最近有点忙啊,工作…

实用指南:【鸿蒙生态共建】鸿蒙6适配-API变化与兼容(2.UI交互与基础能力篇)--《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2026考研政治肖秀荣 408真题教材 资料提供

考研的家人门,是时候背肖秀荣啦分享链接 1、肖秀荣: 链接: https://yun.139.com/shareweb/#/w/i/2rJXzofrVU6xu 提取码:svpg 2、408真题【2009-2025】 链接: https://yun.139.com/shareweb/#/w/i/2rJXAcj2C5xxz …

告别选择困难!SAT辅导机构大揭秘 - 品牌测评鉴赏家

告别选择困难!SAT辅导机构大揭秘选择 SAT 辅导机构,你真的了解这些吗? 准备踏上 SAT 备考征程的小伙伴们,是不是一打开网页,就被铺天盖地的辅导机构广告晃花了眼😵 “顶尖师资”“超高通过率”“独家秘籍”………