一、前言
本文是数据结构系列的第七篇:串。串属于线性结构的一种,它的元素只能是字符。本篇将简要介绍其核心概念与需要掌握的重点内容,所有代码均使用 C++ 语言实现。
二、什么是串?
空串“”和空格串“ ”不一样!比如“Hello”就是一个串,长度为5
三、怎么存串?
定长顺序存储:规定只能存10个字,存满就截断(截断误差)
堆分配存储:“按需买地”。用的时候new一块内存,不用了就delete
四、怎么找子串?
暴力匹配(BF算法):
主串走一步,子串跟一步。一旦不匹配,主串回退到刚才开始位置的下一位,子串回到开头,重新开始比。
缺点:效率太低,做了很多重复的工作
KMP算法:
核心思想:主串指针不回退,利用“已匹配部分的信息”
Next数组(记忆表):它记录匹配失败时,子串应该去哪里继续比,而不是傻乎乎回到开头。
五、小结
本章围绕串这一数据结构,梳理了以下核心知识点:
- 串的基本概念:串是字符的有限序列,属于线性结构的一种。需要区分空串(长度为 0)与空格串(仅含空格字符),并掌握串的长度、子串、主串等基本术语。
- 串的存储结构:重点掌握定长顺序存储和堆分配存储两种方式。定长顺序存储存在截断误差问题,堆分配存储则按需动态分配内存,更加灵活。
- 模式匹配算法:包括暴力匹配(BF 算法)和 KMP 算法。BF 算法思路简单但效率低,主串指针需要回退;KMP 算法通过 Next 数组利用已匹配信息,主串指针不回退,显著提升匹配效率。