如何使用动态编程单独实现转置/交换/旋转/交换距离。我必须强调,我不想检查其他操作(即复制,删除,插入,终止等)只是转置/交换。
我希望将Levenstein的算法应用于交换距离。代码怎么样?
答案 0 :(得分:1)
我不确定在这种情况下可以使用Levenstein的算法。如果没有插入或删除操作,则仅在具有相同长度和相同字符的字符串之间定义距离。无法转换为仅具有转置的相同字符串的字符串示例:
AB, ABC
AAB, ABB
通过这种方法,算法可以找到不在两个字符串中相同位置的字符位置的所有可能排列,并寻找可以用最小数量的转置或交换表示的字符。
答案 1 :(得分:1)
动态编程的有效应用通常要求任务分解为同一任务的多个实例以获得更短的输入。在Levenstein距离的情况下,这归结为两个字符串的前缀和从一个字符串到另一个字符串所需的编辑数。我不知道在你的情况下如何实现这样的分解。至少我没有看到会导致多项式时间算法。
此外,您所谈论的操作还不是很清楚。根据上下文,交换或交换可以表示与转置相同的事物或者替换具有任意其他字母的字母,例如, test->text
。如果通过“transpose / swap / twiddle / exchange”你试图说“转置”,那么你应该看看Counting the adjacent swaps required to convert one permutation into another。如果没有,请澄清问题。