我得到一个数组(让我们称之为a1)的单词(如“狗”,“鱼”,“运行”,“编程”等)非常庞大。
我可以将a1中的任何单词与任何其他单词组合在一起(例如,你可以将“dog”和“programming”结合到“dog-programming”中),然后一次又一次,直到字符串变为真正的大。
我还有一个数组(我们称之为a2)的字符串(例如“de”,“s”,“x?”,“umh”,它们几乎可以是任何东西)。保证a2中没有任何字符串在a1的任何字符串中都找不到。
我正在寻找的是包含a2内所有字符串的最短字符串(创建该字符串所需的组合数最短,而不是字符串包含的字符数)。如果有多个字符串都具有最小长度,我可以选择任何一个,然后保释出该程序。
现在,我认为我不能蛮力这一点,因为即使数组相对较小,也几乎有无穷无尽的选择,但我希望被证明是错误的!
有没有什么好的方法可以获得最短的字符串,这肯定会产生最短的结果,或者我是否必须使用启发式算法来搜索相当短的字符串?
编辑:我尝试从a1中选择一个字符串,从a2中覆盖大多数字符串,然后从a2中删除这些项目,然后重新开始,但它不起作用!它产生了相当不错的结果,但不是最好的。答案 0 :(得分:3)
如果您将这些单词与示例中的短划线组合在一起,例如
dog + programming + sky = dog-programming-sky
并且A2中的单词不包含破折号,那么它只是一个伪装的SET-COVER,一个NP完全优化问题。然后,您可以使用SET-COVER可用的任何解决方案策略来解决问题。 SET-COVER有一个快速逼近算法,但是如果你想拥有绝对最小的解决方案,你需要求助于最坏情况的指数算法。
如果你组合单词没有破折号,例如
dog + programming + sky = dogprogrammingsky
那么问题就更难了,因为现在例如“ogpro”在组合词中找到,即使它不是任何组成字符串的子串。