查找包含给定单词的所有字符的所有单词

我正在创建一个文字游戏。 我在文本文件中列出了英语词典中的所有单词。 我在这个列表中选择一个随机单词。 一旦我有了随机单词,那么我需要选择所有在所选择的随机单词中包含所有字符的单词。

我需要一个策略来做到这一点。 此外,我应将单词列表放在文本文件或数据库中。 这样做的最佳策略是什么?

编辑

匹配示例:

  • “匹配他,他,呃,不是 – > Thee,Tee
  • “箔”匹配油,如果不是 – >填充,傻瓜,关闭,

正如您在上面的示例中所看到的,随机单词不能匹配具有更多字符的单词或具有更多单个字符的单词然后随机单词

例如:

  • e必须与ee不匹配
  • el必须与鳗鱼不匹配
  • 很多不能与战利品相匹配

对于使用拉丁字母的语言中的单词,只有当单词包含字母表中的字母#i时,才能通过将位#i设置为1来计算单词的26位“签名”:

var signature = 0; foreach (var c in word.ToUpperCase()) { signature |= (1<<(c-'A')); } 

然后,您可以将签名及其单词和单词的长度存储在数据库中。 一旦得到需要匹配的单词,计算其签名,并在数据库中查询与签名和目标单词长度匹配的所有单词。 对于具有匹配长度和签名的每个候选词,将该词转换为大写,对其字母进行排序,并将排序后的结果与已排序的目标进行比较。 如果目标匹配,请将该单词添加到答案列表中。

如果我理解正确,那么如果随机单词是“cat”,那么单词“tack”,“taco”,“actor”等就会匹配。

您可以使用LINQ方法:

 Random random = new Random(); string[] words = File.ReadAllLines("words.txt"); string word = words[random.Next(words.Length)]; var matches = words.Where( str => { foreach (char ch in word) { if (str.IndexOf(ch) == -1) return false; // the word is missing a character(s) } // the word contains all characters return true; }); 

从上面的代码中你可以看到我选择了一个文件而不是数据库。 这更容易。

你应该澄清一个问题:如果“asdffffff”是所选的随机单词,“asdf”是否包含所选随机单词的所有字符?

如果答案是肯定的,您可以为每个单词创建一个哈希集。 然后使用集合库来检查所选随机字的集合是否包含在候选字的集合中。

如果答案是否定的,我建议为每个单词构建一个哈希映射。 “asdffffff”的哈希映射如下所示:{a:1 s:1 d:1 f:6}

然后,您将需要遍历散列映射的集合,将所选单词的散列映射与其他散列映射进行比较。

至于数据库问题,我建议从平面文件中读取,直到遇到性能问题,或者有其他原因开始使用数据库。

我认为最好的方法是使用两个表在DB中存储单词:单词 – 带有单词的表和ConnectedWords – 带有两个外键的表,其中1st – fk表示主要单词,2nd表示fk表示匹配主要单词的单词。 因此,您可以通过简单的SQL查询非常快速地获得匹配单词列表

要填写此表,您可以使用此类算法:

  • 将每个单词的字符按字母顺序排序并存储其字段键
  • 匹配单词 – 通过从主要单词键中删除1个字符,可以获得相同键或键的单词

例如

– eht – 随机词

他 – 呃 – 匹配(删除1个符号)

呃 – 呃 – 匹配(删除1个符号)

你 – eeht – 不匹配

Tee – eet – 不匹配

具有相同键的PS词具有非常相似的匹配词列表(1个词的差异)