“财富之轮”中的背景,对于那些不熟悉它的人:在“财富之轮”游戏中,玩家最初会看到一组空白,代表隐藏字母的单词。 (所以玩家知道每个单词的长度,但不知道单词包含的字母。)随着游戏的进行,玩家会猜出字母;如果短语包含该字母,则会显示该短语中该字母的所有位置。例如,游戏(隐藏短语“堆栈溢出”)最初将表示为????? ????????,并且在猜出字母“o”之后,游戏会显示????? Ó?????流。
为简单起见,我们假设我们的游戏只包含一个隐藏的单词。我将使用什么数据结构来保存该单词的所有候选人? (我正在玩一个人工智能选择下一个要猜的字母,所以为了做出选择,我希望能够计算出其他候选人中最常见字母的统计数据。)要清楚,最初我知道我的单词包含N个字母,然后我会学习单词中各种字母的位置,以及单词不包含的字母。
在Good algorithm and data structure for looking up words with missing letters?有一个类似的问题,但我认为这个问题略有不同,因为我有两个以上的空白,而且我也在迭代地修剪我的候选名单(而这个问题似乎只使用了一个单一搜索)。我目前的想法是只保留一个单词的候选列表,初始化为所有英语单词(最多应该有300k-500k单词),然后(对该问题采取类似的方法)使用正则表达式迭代修剪这个候选列表,因为我猜更多的字母,但我很好奇是否有更好的数据结构或算法。
答案 0 :(得分:1)
您应该首先根据大小分割单词。在每个尺寸中,http://en.wikipedia.org/wiki/Trie似乎是一个良好的开端。您将立即修剪整个子树,并且只需在每个节点上翻转一个标记就可以保持trie的顺畅,无论在当前游戏中是否考虑了以该节点为根的子树。