第四章 串

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

【重点】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序列比对。

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

相关推荐
启观川2 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
Leo.yuan2 小时前
2026年实时数据同步工具怎么选?GoldenGate、Striim、SeaTunnel、FineDataLink 5.0横评
大数据
sm_926787052 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
龙亘川2 小时前
AI 协同赋能城市治理:支撑政协数字化履职的技术路径探析
大数据·人工智能·智慧城市·开源软件·数据可视化
逸模2 小时前
BIM在连锁餐饮装修中的应用:不只是画三维图
大数据·数据库·人工智能·物联网·建模
kimloner2 小时前
开源一个 376KB 的 Windows 桌面小工具:便签 + 截图标注 + OCR + 待办提醒(C# / WinForms)
windows·开源·c#·ocr·winforms
liliangcsdn3 小时前
Deepseek R1与V4 Pro参数量对比
大数据
阿松爱学习3 小时前
【Unity开发】Aspose.PDF的使用
unity·pdf·c#
不开大的凯20773 小时前
AI权力游戏:同一天,两种答案,一场算力暗战
大数据·人工智能·ai·ai office
半亩码田3 小时前
C#转Python第4.8篇:正则表达式:Python re 模块 vs C# System.Text.RegularExpressions
python·正则表达式·c#