C# 查找具有给定单词所有字符的所有单词
我正在制作一个文字游戏。我在一个文本文件中列出了英语词典中的所有单词。我在这个列表中随机选择了一个单词。一旦我有了随机词,那么我需要选择所有的词,这些词包含了随机词中的所有字符 我需要一个策略来做到这一点。另外,我应该把单词表放在文本文件或数据库中吗。这样做的最佳策略是什么 编辑 匹配示例:C# 查找具有给定单词所有字符的所有单词,c#,algorithm,C#,Algorithm,我正在制作一个文字游戏。我在一个文本文件中列出了英语词典中的所有单词。我在这个列表中随机选择了一个单词。一旦我有了随机词,那么我需要选择所有的词,这些词包含了随机词中的所有字符 我需要一个策略来做到这一点。另外,我应该把单词表放在文本文件或数据库中吗。这样做的最佳策略是什么 编辑 匹配示例: “There”匹配他,他,呃,不->你,Tee “箔”匹配油,如果不是->填充,愚弄,关闭 正如您在上面的示例中所看到的,随机词不得与字符数多于随机词的词或单个字符数多于随机词的字符相匹配 例如: e
- “There”匹配他,他,呃,不->你,Tee
- “箔”匹配油,如果不是->填充,愚弄,关闭
- e不能与ee匹配
- 鳗鱼不能和鳗鱼相配
- 地段不能匹配战利品
- 如果我理解正确,那么如果随机单词是“猫”,那么单词“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 } 然后,您必须遍历哈希映射集合,将所选单词的哈希映射与其他单词的哈希映射进行比较
至于数据库问题,我建议从平面文件中读取,直到出现性能问题,或者有其他理由开始使用数据库。对于使用拉丁字母的语言中的单词,只有当单词包含字母表中的字母I时,才可以通过将位I设置为1来计算单词的26位“签名”:
var signature = 0;
foreach (var c in word.ToUpperCase()) {
signature |= (1<<(c-'A'));
}
var签名=0;
foreach(word.ToUpperCase()中的var c){
signature |=(1我认为最好的方法是使用两个表将单词存储在DB中:单词-包含单词和连接单词的表-包含两个外键的表,其中1st–fk表示主要单词,2nd–fk表示与主要单词匹配的单词。因此,通过简单的SQL查询,您可以非常快速地获得匹配单词的列表
要填写此表,您可以使用以下算法:
- 将每个单词的字符按字母顺序排序,并将其存储在字段键中
- 匹配词–具有相同关键字或关键字的词,我们可以通过从主词关键字中删除1个字符来获得这些关键字
e、 g
这个–eht–随机词
he–eh–匹配(删除1个符号)
eh–eh–匹配(通过删除1个符号)
e-eeht-不匹配
t-eet–不匹配
p.S.具有相同关键字的单词具有非常相似的匹配单词列表(1个单词中的差异)此算法效率非常低。您有M个单词和N个字母,因此要对M个单词进行N次比较。