返回合集后端面试算法专题字符串 · 组内第 1 / 1 卷 · 合集第 3 / 10 篇
算法专题:字符串
字符串题既考查序列算法,也考查比较规则、Unicode 语义和不可变对象带来的分配成本。
🧭 什么时候考虑这个专题
先明确字符范围和比较规则;两端对应考虑双指针,频次关系考虑哈希,反复拼接再考虑 StringBuilder。
开始编码前先明确输入、输出、数据规模和允许修改的数据,再用一句话写出循环、窗口、堆或递归函数保持的不变量。
核心结构与复杂度
| 知识点 | 核心规则 | 常见复杂度 |
|---|---|---|
| char 与文本元素 | C# char 表示 UTF-16 代码单元,不保证对应完整可见字符 | 扫描通常 O(n) |
| 字符串比较规则 | 标识符通常使用 Ordinal 或 OrdinalIgnoreCase 比较 | 通常 O(n) |
| 字符串不可变 | 字符串修改操作返回新实例或复用已有实例 | 复制成本与字符数相关 |
| StringBuilder 边界 | 未知次数的循环拼接适合使用 StringBuilder | 总成本通常与输出长度线性相关 |
| 回文输入契约 | 编码前必须明确是否忽略符号、大小写和 Unicode 规范化 | 时间 O(n) |
复杂度必须对应真实代码路径。哈希结构要区分平均与最坏情况,递归要计算调用栈,返回结果是否计入空间也应按题目口径说明。
适用边界
- char 与文本元素: 补充字符应按 Rune,组合字符可能还需按文本元素处理
- 字符串比较规则: 面向用户的语言排序才使用明确文化规则
- 字符串不可变: 循环拼接可能产生大量中间分配
- StringBuilder 边界: 少量固定片段直接插值通常更清晰
- 回文输入契约: 不同契约会改变合法字符提取与比较方式
C# 实现检查
- 方法签名与题目契约一致,不依赖控制台输入输出。
- 数值计算检查
int溢出,必要时先提升为long。 - 集合选择说明平均复杂度、顺序语义和重复值处理。
- 字符串题明确使用
char、Rune、序号比较还是文化比较。 - 递归题说明终止条件、最大深度和退化输入。
⚠️ 常见误区
- char 与文本元素: 不要把“一个 char 永远对应一个用户看到的字符”当成规则。
- 字符串比较规则: 不要把“先 ToLower 再比较在所有文化中都等价且无分配”当成规则。
- 字符串不可变: 不要把“字符串变量可重新赋值说明字符串内容可变”当成规则。
- StringBuilder 边界: 不要把“任何字符串连接都必须使用 StringBuilder”当成规则。
- 回文输入契约: 不要把“反转原字符串即可处理所有回文定义”当成规则。
练习顺序
先完成本组 5 道选择题,口述每个选项的边界;再独立实现编程题,最后对照参考答案检查不变量、复杂度和面试追问。