我偶然发现了一个算法问题,简而言之,可以说如下:
我们有n个单词作为输入。尝试以这种方式压缩单词 创建一个尽可能短的新单词,由所有“旧”组成 单词作为连接的子词(你可以得到任何“旧的”单词 在新的一段时间之前和之后划掉所有的字母 字)。
示例:
{aabb,bbcc,c}可以压缩为{aabbcc}
{a,a,a,a,a,a} 可以压缩为{a}
我唯一的想法是人们可以想到的最愚蠢的蛮力 - 我们接受第一个字,通过尝试匹配他们的开始和结束来检查这个词的最大共同部分和其他所有部分,然后连接最重叠的那些。使用新创建的单词在我们的列表中替换它们。重复,直到我们留下一个字。
这个解决方案的问题不仅在于它会在悲惨的情况下变慢,而且在某些情况下似乎没有给出好的答案。假设我们有{aabb,bbaa,b} - 它将连接前两个,因为它们的重叠是2,而第三个只有1。因此,我们得到{aabbaa,b} => {aabbaab}虽然我们可以做{aabbaa}。解决这个问题的一种方法是将给定重叠的单词百分比与子字符串的长度分开,但我不确定这种错误方法的调整是否是一个好主意......
你会建议在最短的时间内获得最佳效果吗?