Pangram是一个使用字母表中每个字母至少一次的句子。
是否可以从给定的单词列表中生成最短的Pangram?
让我们说,我有这样的单词列表
cat monkey temp banana christmas
fast quick quickest jumping
white brown black blue
fox xor jump jumps oven over
now the is was
lazy laziest crazy
dig dog joker mighty
并且喜欢生成可能的pangrams列表如下
the quick over lazy jumps fox dog brown
brown dog fox jumps lazy over quick the
quick brown fox jumps over the lazy dog
现在无需考虑语法和单词排序(我将以非英语进行)
任何想法,算法,代码,参考,将不胜感激!
PS:这不是作业
答案 0 :(得分:3)
不确定。这是一个算法:
答案 1 :(得分:3)
从单词列表生成所有可能的pangrams的最简单方法可能是从列表中生成所有可能的单词组合,然后对于每个单词,检查它是否是pangram。要进行检查,请遍历字符串并为字符串中的每个字母设置bool为true。最后,如果bool全部设置为true,那就是pangram。
更有效的方法可能是遍历每个单词,并设置一个bool数组(或一组位,例如32位int)以及单词的长度。然后,您可以找到或者一起生成一个全部26位设置值的位,并且您有一个pangram。
当你把一个pangram放在一起时,你可以添加边界检查,所以如果添加一个单词会使一个潜在的pangram比你当前最短的pangram(如果有的话)更长,你就可以在那里停止检查。如果你开始按长度排序你的单词,那么你得到更长时间组合的那一刻,就可以退出整套尝试,然后继续下一个可能性。
如果你想要更加复杂,你可以从构建与上面相同的位设置开始。然后取出那些,并将这些位加在一起以确定哪些字母出现在最少的单词中。当您开始生成潜在的pangram时,您知道必须包含其中一个单词。例如。在上面列出的列表中,“懒惰”,“懒惰”和“疯狂”似乎是唯一包含“z”的内容,因此您立即知道每个pangram 必须包含其中一个话。其中没有一个包含“q”,唯一包含“q”的单词似乎是“快速”和“最快”,所以(再次)每个pangram必须包括这两个中的一个(当然我要去从这里的人工检查,所以我可能错过了一个词)。因此,该列表中的所有可能的pangram包括(并且可能从一开始):(快速|最快)(懒惰|懒惰|疯狂)。
你也可以考虑预处理你的单词列表:任何比另一个更长的单词,但不包含至少一个字母缺失的单词可以立即消除。作为一个假设的例子,如果你有“ab”和“abab”,你知道“abab”永远不会导致比“ab”更短的pangram,所以你也可以立即从列表中删除它。
答案 2 :(得分:2)
寻找近似解决方案的想法:
单词评分可能类似于:
score = 0
foreach unique letter in word
score += 1/letter_frequency[letter]
score /= word.length