字谜字符串编辑距离算法/代码?
Posted
技术标签:
【中文标题】字谜字符串编辑距离算法/代码?【英文标题】:anagram string edit distance algorithm/code? 【发布时间】:2015-03-01 23:55:22 【问题描述】:有两个字谜串S和P。有两个基本操作:
-
交换相邻的两个字母,例如交换 BCCAB 中的“A”和“C”,成本为 1。
交换字符串中的第一个字母和最后一个字母,成本为1。
问题:设计一种有效的算法,以最小化将 S 变为 P 的成本。
我尝试了一个贪心算法,但我找到了反例,我认为它是不正确的。我知道著名的 DP 问题编辑距离,但我没有得到这个公式。
有人可以帮忙吗?一个想法和伪代码会很棒。
【问题讨论】:
【参考方案1】:我想知道http://en.wikipedia.org/wiki/A*_search_algorithm 是否算有效?对于启发式算法,寻找每个字符必须经过的最小距离,将字符串视为一个圆圈,然后将这些距离的总和除以 2。在圆上,每个角色都需要参与足够多的交换才能将其一次一步移动到目的地,并且每次交换只影响两个角色,所以这个启发式应该是所需交换次数的下限。
【讨论】:
【参考方案2】:没有端部交换,答案很简单:你必须把第一个和最后一个字母弄对,以后再做就没有办法“保存”了;因此对于单词 ai 其中0 <= i < n
你会“冒泡”正确的 a0 和 an-1 ,然后重复对于单词 ai 其中1 <= i < n-1
直到您剩下 0 或 1 个字母。
使用ends-swap 选项,您会遇到更困难的问题,因为每个字母可以通过两个方向到达正确的位置。您基本上在源词和目标词之间有一个二分图,并且您希望找到一个使距离总和最小化的匹配。即使这样也不是真正的算法,因为每次交换移动两个字母,而不仅仅是一个。
底线是,您可能必须进行搜索,但至少您可以将搜索与无端交换距离绑定。
【讨论】:
如果您忘记第二条规则并简单地将字符串视为循环缓冲区,您可以在两个方向上“围绕”冒泡,也许更容易找到解决方案 - 实际上只是不同的心理模型。 ..以上是关于字谜字符串编辑距离算法/代码?的主要内容,如果未能解决你的问题,请参考以下文章