我确信你们都听说过“文字游戏”,你试图通过一次改变一个字母来改变一个单词,而只是通过有效的英语单词。我正在尝试实现一个A *算法来解决它(只是为了充实我对A *的理解),其中一个需要的是最小距离启发式。
也就是说,这三个突变中的一个可以将任意字符串变为另一个字符串b的最小数量b: 1)将一个字母换成另一个字母 2)在任何字母之前或之后的某个地方添加一个字母 3)删除任何字母
实施例
aabca => abaca:
aabca
abca
abaca
= 2
abcdebf => bgabf:
abcdebf
bcdebf
bcdbf
bgdbf
bgabf
= 4
我尝试了很多算法;我似乎无法找到每次给出实际答案的人。事实上,有时我甚至不确定我的人类推理是否能找到最佳答案。
有没有人为此目的知道任何算法?或者也许可以帮我找一个?
(只是为了澄清,我要求的算法可以将任意字符串转换为任何其他字符串,无视其英语有效性。)
答案 0 :(得分:6)
你想要minimum edit distance (or Levenshtein distance):
两个字符串之间的Levenshtein距离定义为将一个字符串转换为另一个字符串所需的最小编辑数,允许的编辑操作是插入,删除或替换单个字符。它以弗拉基米尔·莱文施泰因(Vladimir Levenshtein)的名字命名,弗拉基米尔·莱文施泰因于1965年考虑了这一距离
确定编辑序列的一种算法位于同一页here。
答案 1 :(得分:2)
“编辑距离”的优秀参考资料是S. Dasgupta,C。H. Papadimitriou和U.V. Vazirani的算法教科书第6.3节,其草案可以自由here。
答案 2 :(得分:1)
如果您有一个合理大小(小)字典,广度优先树搜索可能会有效。
所以从你的单词可以变异的所有单词开始,然后所有这些单词都可以变异(除了原始单词),然后进入第三级......直到找到你要找的单词。
你可以消除不同的词(远离目标的词),但这样做可能会导致你在必须经历某种发散状态以达到最短路径的情况下失败。