为何最长公共子序列(LCS)距离在编辑距离中禁止替换操作?
关于最长公共子序列(LCS)距离的疑问
编辑距离是一类经典问题,常见类型包括:
不同类型的编辑距离允许不同的字符串操作集合,例如:
- Levenshtein距离:支持删除、插入、替换操作
- 最长公共子序列(LCS)距离:仅允许插入和删除操作,不支持替换
- Hamming距离:仅允许替换操作,因此只适用于长度相同的字符串
- Damerau–Levenshtein距离:支持插入、删除、替换以及相邻字符换位操作
- Jaro距离:仅允许换位操作
我对LCS距离的规则存在两个困惑点:
- 为什么它不允许替换操作?按照我对算法的理解,如果某个字符潜在能匹配目标字符串里的字符,就不会被替换或删除。
- 为什么它允许插入和删除操作?会不会出现某个本可匹配的字符,因为在目标字符串里位置靠后而被删除的情况?
为了方便分析,我写了一个算法,用网格形式展示计算结果(原算法带颜色标记路径,这里无法显示):
$ java dynamic_programming.EditDistance republicans democrats true | | |d |e |m |o |c |r |a |t |s | | |0 |1 |2 |3 |4 |5 |6 |7 |8 |9 | |r |1 |2 |3 |4 |5 |6 |5 |6 |7 |8 | |e |2 |3 |2 |3 |4 |5 |6 |7 |8 |9 | |p |3 |4 |3 |4 |5 |6 |7 |8 |9 |10| |u |4 |5 |4 |5 |6 |7 |8 |9 |10|11| |b |5 |6 |5 |6 |7 |8 |9 |10|11|12| |l |6 |7 |6 |7 |8 |9 |10|11|12|13| |i |7 |8 |7 |8 |9 |10|11|12|13|14| |c |8 |9 |8 |9 |10|9 |10|11|12|13| |a |9 |10|9 |10|11|10|11|10|11|12| |n |10|11|10|11|12|11|12|11|12|13| |s |11|12|11|12|13|12|13|12|13|12| ========================= 12 // (New Edit Distance, Without Substitution)
内容的提问来源于stack exchange,提问作者VIAGC
相关产品推荐
相关产品推荐

