功能说明
levenshtein_distance 计算把一段字符串转换成另一段所需的最少单字符插入、删除和替换次数。实现只保留上一行和当前行,因此空间复杂度为 O(min(n,m)),适合拼写纠错、模糊搜索、DNA 序列比较和输入建议。similarity 把距离归一化为 0 到 1 之间的比例,closest_match 在候选列表中寻找距离最小的字符串,并可用 max_distance 过滤掉差距过大的结果。
函数先处理相等、空串和交换长短串等边界,再逐行填充动态规划表。对于长度为几千的字符串,这种实现仍然可行;更长的文本应考虑带剪枝的算法或专用库。
关键代码
每个单元格取插入、删除和替换三种代价的最小值:
insertion = current[column - 1] + 1
deletion = previous[column] + 1
substitution = previous[column - 1] + (
left_character != right_character
)
current.append(min(insertion, deletion, substitution))
由于只依赖上一行和当前行左侧的值,内存可以压缩为两个一维数组。
使用注意
标准 Levenshtein 距离不把相邻字符交换视为一次操作;例如 recieve 与 receive 的距离是 2,如果需要把 transposition 算作一步,应使用 Damerau-Levenshtein。距离对大小写和 Unicode 组合字符敏感,比较前应按业务需要统一大小写并做 Unicode 规范化,否则视觉相同的文本可能得到较大距离。
similarity 以较长字符串长度为分母,空串与空串返回 1,空串与非空串返回 0。closest_match 在距离相同时保留最先出现的候选,不额外按字母序排序;max_distance 必须是非负整数。候选数量很大时逐个计算成本较高,生产环境可先用长度差或 n-gram 索引缩小范围。
验证方式
示例输出 kitten 与 sitting 的距离 3、相似度 0.571,flaw 与 lawn 的距离 2,空串与非空串的距离 3。closest_match("receve", ...) 应返回 ("receive", 1),说明只差一个字符;限制 max_distance=1 时仍返回 receive。传入非字符串候选应捕获 candidates must be strings。