这个问题出现在程序设计大赛去除一些特定单词的所有出现的最小化字符串的长度,我们仍然不知道如何解决它。如何通过反复从字符串
问: 给定的线S和串L1名单,我们希望保持删除子,可能是在L的所有出现,我们必须尽量减少形成最终的字符串的长度。另请注意,删除字符串可能会启动更多清除。
例如,
- S = ccdedefcde,L = {} CDE 然后回答= 1。因为我们可以通过ccdedefcde减少的S - > cdefcde - > fcde - > F。
- S = aabaab,L = {AA,BB}然后回答= 0作为还原可以通过aabaab进行 - > AABB - > AA - > '空字符串'
- S = acmmcacamapapc,L = {MCA, pa}则答案= 6,因为可以通过acmmcacamapapc-> acmcamapapc - > acmapapc - > acmapc执行缩减。
S的最大长度可以是50和列表L的最大长度可达50
我的做法是一个基本的递归遍历中,我回到了最小长度,我可以通过删除得到不同子串。不幸的是这个递归方法将在最坏的情况下输入超时,因为我们必须在每一步50个选项和递归深度为50
请提出一个高效的算法,可以解决这个问题。
您可以通过维护一套迄今为止所遇到的减少串加快了这个问题的基本的递归深度优先搜索。当你看到其中的一个再次返回而不是从该字符串重复递归。 – mcdowella
此问题很难:即使对于| L | = 1的问题实例,贪婪的最左边删除算法也可能会失败。 S = ABABAA,L = {ABA}。最左边的贪婪会删除[ABA] BAA离开BAA,这不能进一步降低。但是,如果您删除AB [ABA] A以获得ABA,则可以删除[ABA]以获取空字符串。 –