Skip to content

字符串的常见操作

本节整理字符串的常见操作。

字符串问题通常不是只保存文本,而是围绕文本进行访问、比较、截取、拼接和查找。理解这些操作及其成本,是后续学习字符串匹配算法的基础。


访问字符是最基础的字符串操作。

string text = "algorithm";
char first = text[0];
char last = text[text.size() - 1];

访问字符时要特别注意边界。如果字符串为空,就不能访问第一个字符或最后一个字符。


比较字符串可以判断两个字符串是否相等。

bool same = text1 == text2;

字符串比较通常需要逐个比较字符。最坏情况下,如果两个字符串长度相同且前面字符都一样,就可能比较到最后一个字符,因此时间复杂度通常与字符串长度有关。


子串是字符串中连续的一段。

例如,algorithm 的一个子串可以是 algo,也可以是 rithm

string text = "algorithm";
string part = text.substr(0, 4);

这些代码都可以得到前 4 个字符组成的子串 algo。截取子串通常会产生一个新字符串,因此成本往往与子串长度有关。


拼接是把多个字符串连在一起。

string fullName = firstName + " " + lastName;

少量拼接通常没有问题。但如果在循环中大量拼接,就要考虑前一节提到的中间对象和复制成本。


查找子串指的是判断一个字符串中是否包含另一个字符串,或者找到它出现的位置。

string text = "data structure";
string pattern = "struct";
size_t index = text.find(pattern);

这些语言都提供了内置查找方法。学习数据结构时,我们还需要理解这些查找方法背后的基本思想:最简单的方法是从每个可能起点开始逐个比较,后续会学习暴力匹配和 KMP 的差异。


字符串常见操作包括访问字符、比较字符串、截取子串、拼接字符串和查找子串。

这些操作看起来简单,但背后都有成本。访问字符通常很快,比较和查找可能需要逐字符处理,截取和拼接通常涉及新字符串创建。分析字符串问题时,要关注操作发生的次数和字符串长度。