levenshtein编辑距离可压缩为两个一维数组滚动更新:初始化prev为0,1,…,n,curr用于逐行计算;每轮i中设curr[0]=i+1,对j∈[1,n]按插入、删除、替换/匹配更新curr[j],再交换prev与curr;最终prev[n]即结果。

要实现 Levenshtein 编辑距离的存储优化版本,避免 O(m×n) 二维数组空间开销,需将动态规划状态压缩为两个一维数组或单个一维数组滚动更新。该解法在处理长字符串(如超 10⁴ 字符)时显著降低内存占用,防止栈溢出或堆分配失败。
初始化滚动数组与边界处理
声明两个长度为 n+1 的整型向量 prev 和 curr,其中 n 是目标字符串长度;prev 初始化为 0,1,2,…,n,表示空源串到 target[0..j] 的编辑距离;curr 初始值任意,将在循环中被覆盖。
这一步不可跳过:若省略 prev 的显式初始化,后续第一行计算将全部错误,因为第 0 行对应源串为空的情形,必须严格为递增序列。
逐行填充并滚动更新
遍历源字符串 s 的每个字符 s[i](i 从 0 到 m−1),对每个 j ∈ [0, n) 执行:
① curr[0] = i + 1(源串前 i+1 字符变为空串需删 i+1 次);
② 对 j 从 1 到 n,计算:
cost = (s[i] == t[j−1]) ? 0 : 1;
curr[j] = min({curr[j−1] + 1, prev[j] + 1, prev[j−1] + cost});
③ 交换 prev ↔ curr,进入下一轮。
注意:curr[j−1] 是左邻(插入)、prev[j] 是上邻(删除)、prev[j−1] 是左上邻(替换/匹配),三者必须来自正确轮次;【交换 prev 和 curr 必须在内层 j 循环结束后立即执行,否则下一轮 i 的 prev 仍是脏数据】。
返回最终结果
循环结束后,prev[n] 即为完整编辑距离值。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











