标准二维DP不推荐因空间O(m×n)、缓存不友好,如10k字符串需约400MB内存;应改用一维滚动数组优化至O(min(m,n)),并严格初始化边界(dpi=i, dp0=j)、处理UTF-8需转u32string。

Levenshtein 距离用标准二维 DP 实现内存开销大、缓存不友好,实际项目中应优先用一维滚动数组优化,且必须注意边界初始化和索引偏移。
为什么标准二维 dp[i][j] 在 C++ 中不推荐直接用
标准实现需 dp 数组大小为 (m+1) * (n+1),对长字符串(如 10k 字符)会分配上亿个 int,不仅耗内存,还因随机访问破坏 CPU 缓存局部性。更关键的是,每次只依赖上一行和左邻值,二维存储纯属冗余。
- 必须用
std::vector而非裸new int[],避免异常安全问题 - 初始化时第 0 行(空字符串到
s2[0..j-1])必须设为j,第 0 列同理——漏掉这个会导致所有结果偏小 - 若字符串含 Unicode(UTF-8),不能直接按
char算长度,得先转std::u32string或用 ICU 库预处理
一维滚动数组的正确写法:prev 和 curr 怎么交替
核心是只保留两行:上一行 prev[j] 对应 dp[i-1][j],当前行 curr[j] 构建 dp[i][j]。注意 curr[0] 始终是 i(删完 s1[0..i-1]),而 prev[0] 是 i-1。
std::min({a,b,c})
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











