我面临的问题是创建一个有效的算法,从一个固定的单词列表中返回单词列表,这个单词列表可以通过使用特定的字母集(这个集合是输入)来拼写,而这个集合没有上限(或者至少没有有用的上限)。
更具体地说,该算法需要为不断增加的输入提供实时解决方案,尽管只要前几个输出元素相对较快地出来,输出就可以缓慢地流出。
**注意:输入的实际增强只能以添加到现有集合的形式发生。当选择一个单词时,LetterStock将耗尽所有使用的字母,并且算法将再次从头开始运行。
可能的字符集是26个标准罗马字母。每个字母的库存量可以是0->无穷大(用于所有密集目的),并且每个字母只能使用一次(例如,a,b,l不会返回"ball",而a,bb,d,lll会)
正在使用的单词列表是恒定的,所以如果任何预先计算的散列解决方案对加速运行时性能有用,那是一个选择(尽管我想不出一个好的方法来做到这一点)。但是,单词列表很大(~40,000个元素)。
到目前为止,我设计的最好的算法包括使用字母库存数组的副本迭代整个单词集,逐个字母地检查每个单词,耗尽副本库存并查看是否有任何字母低于0。如果是,我继续,如果不是,我到达单词的末尾,我将单词添加到解决方案集中。在浏览完整个单词集之后,我再次从头开始查找现在我可以拼写的单词,因为我的LetterStock中添加了一个或多个字符。
// 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;
}
因此,我的问题是:这种实现是最优的吗?如果不是,什么是更好的实现?
发布于 2011-03-16 16:06:21
稍微开箱即用,但你有没有考虑过使用像Sqlite这样的东西来存储/查询单词?可能会解决你所有的问题
发布于 2011-03-16 16:14:55
我认为directed acyclic word graph (或DAWG)就是你所需要的。我第一次使用这种结构是在25年前的一个拼字游戏程序中(我们从WordPerfect那里窃取了DOS的字典)。如果你发现很难从你的单词列表中创建一个DAWG,不要放弃--这是一个非常令人满意的成就。
发布于 2011-03-16 16:13:54
稍微优化一下,但是如果你知道你的字母数是5,单词中的字母数是6,你就不需要检查单词了。
https://stackoverflow.com/questions/5327840
复制相似问题