【问题标题】:anagram string edit distance algorithm/code?字谜字符串编辑距离算法/代码?
【发布时间】:2015-03-01 23:55:22
【问题描述】:

有两个字谜串S和P。有两个基本操作:

  1. 交换相邻的两个字母,例如交换 BCCAB 中的“A”和“C”,成本为 1。
  2. 交换字符串中的第一个字母和最后一个字母,成本为1。

问题:设计一种有效的算法,以最小化将 S 变为 P 的成本。

我尝试了一个贪心算法,但我找到了反例,我认为它是不正确的。我知道著名的 DP 问题编辑距离,但我没有得到这个公式。

有人可以帮忙吗?一个想法和伪代码会很棒。

【问题讨论】:

    标签: algorithm anagram


    【解决方案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 选项,您会遇到更困难的问题,因为每个字母可以通过两个方向到达正确的位置。您基本上在源词和目标词之间有一个二分图,并且您希望找到一个使距离总和最小化的匹配。即使这样也不是真正的算法,因为每次交换移动两个字母,而不仅仅是一个。

      底线是,您可能必须进行搜索,但至少您可以将搜索与无端交换距离绑定。

      【讨论】:

      • 如果您忘记第二条规则并简单地将字符串视为循环缓冲区,您可以在两个方向上“围绕”冒泡,也许更容易找到解决方案 - 实际上只是不同的心理模型。 ..
      猜你喜欢
      • 2016-11-21
      • 2021-08-01
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      • 2012-05-18
      • 2018-09-21
      相关资源
      最近更新 更多