【发布时间】:2011-07-16 17:13:12
【问题描述】:
我面临的问题是创建一个有效的算法,该算法从一个固定的单词列表中返回单词列表,该列表可以通过使用一组特定的字母(这个集合是输入)来拼写,这个集合没有上限(或至少没有有用的上限)。
更具体地说,该算法需要为不断增加的输入提供实时解决方案,尽管只要前几个输出元素相对较快地出现,输出就可以慢慢流出。
**注意:输入的真正增强仅以添加到现有集合的形式发生。当一个单词被选中时,LetterStock 中的所有字母都会被耗尽,算法会再次从头开始运行。
可能的字符集是 26 个标准罗马字母。每个字母的存量可以是 0->infinity(用于所有密集目的)并且每个字母只能使用一次(例如 a,b,l 不会返回“ball”,尽管 a,bb,d,lll 会)
正在使用的单词列表是恒定的,因此如果任何预先计算的哈希解决方案对加速运行时性能有用,那么这是一个选项(尽管我想不出一个好的方法来做到这一点)。但是,单词列表很大(约 40,000 个元素)。
到目前为止,我设计的最佳算法涉及使用字母库数组的副本遍历整个单词集并逐个字母检查每个单词,耗尽副本库并查看是否有任何字母出现在下面0. 如果是,我继续,如果不是并且我到达单词的末尾,我将单词添加到解决方案集中。在浏览了整组单词之后,我从头开始寻找我现在可以拼写的单词,因为我的 LetterStock 中已经添加了 1 个或多个字符。
// Pass in the string and a copy of the LetterStock 26-entry array
bool canBeSpelled(string str, int *letterStock)
{
for(int i=0; i<str.length; i++)
{
letterStock[str[i]-65]--; // deplete the letter stock for the given letter
if(letterStock[str[i]-65] < 0)
return false;
}
return true;
}
因此,我的问题是:这个实现是最优的吗?如果不是,那么什么是更好的?
【问题讨论】:
-
@Alexander “real-time” 在编程中的 specific meaning 与您的问题无关。我删除了该标签,因为它具有误导性。
-
你只是在创建一个字谜生成器吗?
-
似乎很奇怪,您只想生成一个随机的单词列表,可以使用一组字母创建,同时删除使用过的字母,但您没有最大化或最小化创建的单词数。
-
"每个字母的存量可以是 0->infinity" - 好吧,如果缺少限制会导致特定问题,那么您可以将其上限设置为任何字母出现的最大次数在您的字典中的一个单词中。这是一个严格的界限,因为它是您可以在不破坏任何东西的情况下全面应用的最小界限。
-
这不是和this question类似吗?