【发布时间】:2013-08-07 18:01:24
【问题描述】:
假设我有这组字符串:
strings = {'qqq', 'eqq', 'qqw', 'www', 'qww', 'wwe', 'eee', 'eeq', 'wee', 'qwe'}
如何编写一个算法来排列字符串以使它们最大程度地重叠?我已经知道一种排列方式如下:
qww
www
wwe
wee
eee
eeq
eqq
qqq
qqw
qwe
但是,我通过蛮力解决方案找到了上述结果。有更聪明的方法吗?
【问题讨论】:
-
这看起来像是来自 Rosalind.info 的内容。
-
只是想了想:以字符串为顶点、以边为重叠量的图形。进行图遍历以找到包括具有最大成本的所有顶点的最短路径?
-
@Bill 我以前从未听说过这个,但我确实意识到,当我研究这个时,它有点类似于匹配 DNA 序列。对于真正想知道的人来说,这与游戏 Dota 2 中的一个叫 Invoker 的英雄有关。他可以同时激活 3 个球体(q、w 或 e),并且他可以使用他的活跃球体来调用一个法术基于他的球体组合。这是为了计算出调用所有 10 个法术所需的最少击键次数。
-
@Lanaru:正如 Peter de Rivaz 的回答所暗示的,这个问题是 NP 完全的,所以如果你需要一个完美的答案,你的蛮力算法已经是最优的了。但是由于您的问题空间很小(2^N=1024),谁在乎呢?