第四章 串

【考纲内容】字符串模式匹配

【重点】KMP算法,next数组与nextval数组

串的基本概念

串(String)是由零个或多个字符组成的有限序列,是一种特殊的线性表。串的逻辑结构与线性表类似,区别在于串的数据对象限定为字符集。

重要术语

  • 长度:串中字符的个数(空串长度为0)。
  • 子串:串中任意个连续字符组成的子序列。
  • 主串:包含子串的串。
  • 位置:字符在串中的序号(从1开始)。

串的存储结构

1. 定长顺序存储

用一组连续的存储单元存储字符,长度固定(超出部分截断)。

cs 复制代码
#define MAXLEN 255  
typedef struct {  
    char ch[MAXLEN];  
    int length;  
} SString;  

2. 堆分配存储

动态分配内存空间,长度可变。

cs 复制代码
typedef struct {  
    char *ch;  
    int length;  
} HString;  

3. 块链存储

用链表存储串的字符,每个结点可存多个字符(如块大小为4)。

cs 复制代码
typedef struct Chunk {  
    char ch[4];  
    struct Chunk *next;  
} Chunk;  
typedef struct {  
    Chunk *head, *tail;  
    int length;  
} LString;  

串的基本操作

赋值操作

将串T的值赋给串S(需保证S有足够空间)。

比较操作

按字典序比较两个串的大小(如"abc" < "acd")。

求子串

从主串的指定位置截取指定长度的子串。

连接操作

将串S1和串S2拼接为新串(如"Hello" + "World" = "HelloWorld")。

模式匹配

在主串中查找子串的位置(经典算法:朴素匹配、KMP算法)。


模式匹配算法

朴素匹配(Brute-Force)

逐个字符比较,失败时主串回溯到起始位置的下一位。

时间复杂度:O(n*m)(n为主串长度,m为子串长度)。

KMP算法

利用部分匹配表(next数组)避免主串回溯。

  • next数组:记录子串前缀与后缀的最长公共长度。
  • 时间复杂度:O(n+m)。

示例:子串"ababc"的next数组为[0, 0, 1, 2, 0]


串的应用

  • 文本编辑:查找、替换、插入等操作。
  • 搜索引擎:关键词匹配。
  • 生物信息学:DNA序列比对。

通过理解串的存储结构和核心操作,可以高效处理文本相关任务。

相关推荐
大大大大晴天1 天前
Hudi技术内幕:深入解析Index索引机制
大数据
阿里云大数据AI技术1 天前
Flink Forward Asia 2026 深圳启幕:Agentic Streaming for AI,开启实时智能新范式
大数据·flink
SelectDB2 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc
刘马想放假2 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
雨落倾城夏未凉3 天前
第四章c#方法-参数数组和可选参数(16)
后端·c#
北域码匠3 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
唐青枫4 天前
线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
c#·.net
唐青枫5 天前
别只会反射:C#.NET Emit 动态生成代码实战详解
c#·.net
咕白m6255 天前
.NET 环境下 Word 超链接批量提取方案
c#·.net
用户91721561902115 天前
C# 通信协议增量解析:用状态机处理半包和粘包
c#