我得到了一个数组(我们称之为a1)的单词(如“狗”,“鱼”,“运行”,“编程”任何东西) 。找到包含指定集合中每个字符的单词的最短组合
我可以将a1中的任何单词与任何其他单词结合在一起(例如,您可以将“狗”和“编程”组合成“狗编程”),然后再一次,直到字符串获取真的很大。我还得到了一个字符串的数组(例如“de”,“s”,“x?”,“umh”,他们可能几乎是任何东西)。保证a2中没有任何字符串不能在a1的任何字符串中找到。
我在找的是最短的字符串(在创建该字符串时需要多少个组合,而不是多少个字符串包含的字符),它包含了a2中的所有字符串。如果有多个字符串都具有最小长度,我可以选择任何字符串,然后从程序中退出。
现在,我不认为我可以蛮力这个,因为即使数组相对较小,实际上有无数的组合这些单词的选项,但我很想被证明是错误的!
有没有什么好的方法来获得最短的字符串,肯定会产生最短的结果,或者我必须使用启发式算法来搜索很短的字符串?
编辑:我试着从a1中挑选一个字符串,从a2覆盖大多数字符串,然后从a2中删除这些项目,然后重新开始,但它不起作用!它产生相当好的结果,但不是最好的。
谢谢!就我而言,这就像你的第一个例子。你会为我的问题提出什么近似算法? – Fred 2010-01-07 18:53:34
+1好回答等等等等现在超过15个字符的要求:) – 2010-01-07 19:10:54
嗨,有一个规范的近似算法集覆盖,也很容易实现。它覆盖在“封面”维基百科页面上!这很简单,但实际上是最好的!来自维基百科:“不可约性结果表明,贪婪算法本质上是集合覆盖的最佳可能多项式时间近似算法(见下面的不可约性结果),在合理的复杂性假设下”。在http://en.wikipedia.org/wiki/Set_cover_problem查看 – 2010-01-07 19:44:46