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

时间:2011-12-26 00:17:55

标签: c# algorithm

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

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

修改

匹配示例:

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

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

例如:

  • e必须与ee不匹配
  • el必须与eel不匹配
  • 很多不得与战利品相匹配

4 个答案:

答案 0 :(得分:2)

对于使用拉丁字母的语言中的单词,您可以计算单词的26位"签名"只有在单词包含字母#i的字母#i时才将#i设置为1:

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

然后,您将不得不浏览哈希映射的集合,将所选单词的哈希映射与其他哈希映射进行比较。

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

答案 3 :(得分:0)

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

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

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

e.g。

- eht - 随机词

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

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

Thee - eeht - 不匹配

Tee - eet - 不匹配

P.S。具有相同键的单词具有非常相似的匹配单词列表(1个单词中的差异)