【发布时间】:2018-07-16 18:07:34
【问题描述】:
我的目的是将多个字符串打成一个(最短的)字符串,该字符串将包含每个字符串的所有字符。这个问题不是特定于任何语言的,而是更多到algorithm 部分。 (可能会在节点服务器中实现,所以标记nodejs/javascript)。
所以,解释一下问题:
假设我的字符串很少
["jack", "apple", "maven", "hold", "solid", "mark", "moon", "poor", "spark", "live"]
结果字符串应该是这样的:
"sjmachppoalidveonrk"
杰克:sjmachppoalidveonrk
apple: sjmachppoalidveonrk
solid:sjmachppoalidveonrk
=====================================>>>> 全部向前
这些都是手动评估,示例中的输出可能不是 100% 完美。
所以,关键是每个字符串的所有字母都必须存在于输出中
FORWARD DIRECTION(这里是实际问题所在),并且可能服务器将发送最终的字符串和像27594 这样的数字将被生成并传递以在所需的末尾提取令牌。如果我必须用尽可能少的字符串打孔它会容易得多(这种情况只有唯一的字符就足够了)。但是在这种情况下有几点:
字母可以出现多次,但我必须重复使用任何字母 如果可能的话,请写信,例如:
solid和holdo > l > d可以 重用为正向,但用于apple(a > p) 和spark(p > a)我们必须重复a,因为在一种情况下它出现在p之前 对于apple,在p之后对于sparks所以要么我们需要重复a或p。甚至,我们不能做p > a > p,因为它不会涵盖这两种情况 因为我们需要在a之后为apple提供两个p我们直接没有选择放置单个
p并使用相同的 一次提取索引两次,我们需要多个p,没有选项 留下作为输入字符串包含该- 我(不)确定,一组可能有多个输出 字符串。但令人担忧的是它的长度应该是最小的, 如果组合向前覆盖所有标记,则该组合无关紧要。最小可能长度的所有(或一个)输出 需要追踪。
- 将此点作为EDIT添加到此帖子中。在阅读了 cmets 并知道它已经存在之后 问题被称为shortest common supersequence problem 我们可以 定义结果字符串将是最短的 我们可以从中重新生成任何输入字符串的字符串 删除一些(0 到 N)个字符,这与所有输入都可以在结果字符串中的正向找到相同。
我尝试过,从一个任意字符串开始,然后分析下一个字符串并拆分所有字母,并相应地放置它们,但是经过一段时间后,似乎可以将当前字符串字母放在更好的位置方式,如果根据当前字符串放置最后一个字符串(或前一个字符串)的字母。但是再一次,该字符串是根据处理过的东西(多个)进行分析和放置的,并且将一些东西放在有利于未处理的东西上似乎很困难,因为我们需要处理它。或者我是否可以维护所有已处理/未处理树的树将有助于构建最终字符串?有什么比它更好的方法,它似乎是一个蛮力?
注意:我知道还有很多其他的转换可能,请尽量不要建议使用其他任何东西,我们正在研究它。
【问题讨论】:
-
@Downvoters,您可以在评论中解释原因,因为这对其他人也有帮助。
-
我没有投票,但这看起来像是 CS 作业问题,可能是负面关注的原因。
-
@viraj_os 好吧,一点也不,至少如果有人这么认为可以澄清,或者如果不能有解决方案,至少不应该气馁。无论如何感谢您的评论。
-
@mhumthanx 获取信息。这里的情况完全一样,我们可以很容易地找到 2 个字符串,但是超过 2 个字符串就很难找到解决方案(最好的情况)
标签: javascript node.js algorithm