《数据结构:从0到1》-11-字符串与模式匹配

一、 什么是字符串?
在数据结构中,字符串(String)是由零个或多个字符组成的有限序列。它可以被视作一种特殊的线性表,其数据元素限定为字符。字符串在日常编程中无处不在。
1.1 字符串的表示与存储
存储方式主要分为两种:
- 顺序存储:使用一组地址连续的存储单元来存储字符串的字符序列。
- 链式存储:使用链表来存储字符串,每个结点可以存放一个或多个字符。
我们这里主要讨论最主流的顺序存储。
C语言中的字符串(字符数组):
// 定义一个字符数组来存储字符串 "Hello"
// 方式一:手动添加结束符
char str[10] = {'H', 'e', 'l', 'l', 'o', '\0'};
// 方式二:字符串字面量,编译器会自动在末尾添加 '\0'
char str2[] = "Hello"; // 注意:'\0' 是字符串的结束标志,是C语言中判断字符串结尾的关键。
Java/Python中的字符串:
在Java和Python等高级语言中,字符串是一个内置的类(String),其底层通常也是基于字符数组实现,但为开发者封装了丰富的操作,并且具有不可变性(Immutable) 的特性。这意味着任何对字符串的修改操作,实际上都是创建了一个新的字符串对象。
// Java示例
String s1 = "Hello";
String s2 = s1 + " World!"; // 这里s1并没有被修改,而是创建了一个新的String对象给s2
1.2 字符串匹配
字符串匹配应用场景非常广泛,比如:文本编辑器的查找功能(Ctrl+F)、搜索引擎、防病毒软件文件扫描等,这些场景的核心:如何在一个较长的“主串”中,高效地定位一个“模式串”? 这就是我们今天要说的重点模式匹配问题。
定义:
- 主串 (S):被搜索的长字符串。
- 模式串 §:需要寻找的短字符串。
- 模式匹配:在主串S中查找与模式串P完全相同的子串,并返回其起始位置的过程。
二、 朴素的模式匹配算法
当我们遇到“在一段文字中找一个词”的问题时,脑海中浮现的最直接的方法是什么?没错,就是逐字对比。
2.1 算法思想
朴素模式匹配算法(Brute-Force Algorithm)的思想非常简单直接,我们先看一个原理图:

下面用一张流程图来清洗地展示这个过程:
