【问题标题】:Find all words that have all characters of a given word查找具有给定单词的所有字符的所有单词
【发布时间】:2011-12-26 18:16:17
【问题描述】:

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

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

编辑

匹配示例:

  • “The”匹配 he, he, eh, te NOT -> Thee, Tee
  • "foil" 匹配 oil, of, if NOT -> 填充,傻瓜,关闭,

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

例如:

  • e 不能与 ee 匹配
  • el 不能与 eel 匹配
  • 批次不能与战利品匹配

【问题讨论】:

    标签: c# algorithm


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      如果我理解正确,那么如果随机词是“猫”,那么“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;
          });
      

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

      【讨论】:

      • 这个算法效率真的很低。你有 M 个单词和 N 个字母,所以你要对 M 个单词进行 N 次比较。
      【解决方案3】:

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

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

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

      然后,您必须遍历哈希图集合,将所选单词的哈希图与其他哈希图进行比较。

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

      【讨论】:

        【解决方案4】:

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

        为了填写这个表格,你可以使用这样的算法:

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

        例如

        -eht-随机词

        he - eh - 匹配(通过删除 1 个符号)

        eh – eh – 匹配(通过删除 1 个符号)

        你 - 呃 - 不匹配

        Tee - eet - 不匹配

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-20
          • 2011-04-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多