C# d)争议裁决委员会)
我的解决方案是使用两个表->一个表将只是字典中每个可能的字母组合的列表,并按字母顺序排列组件字母。(即测试将是ESTT,测试将是ERSTT,DAD将是ADD) 第二个表将包含表1的每个单词和对键的引用 表1-字母输入法C# d)争议裁决委员会),c#,mysql,regex,C#,Mysql,Regex,我的解决方案是使用两个表->一个表将只是字典中每个可能的字母组合的列表,并按字母顺序排列组件字母。(即测试将是ESTT,测试将是ERSTT,DAD将是ADD) 第二个表将包含表1的每个单词和对键的引用 表1-字母输入法 Index Letters 1 ESTT 2 ESTTER 3 EST 4 ADD 5 APST 在表1中,按字母顺序插入单词字母-test变为estt 表二-词语 Index LetterInWordIndex Word 1
Index Letters
1 ESTT
2 ESTTER
3 EST
4 ADD
5 APST
在表1中,按字母顺序插入单词字母-test变为estt
表二-词语
Index LetterInWordIndex Word
1 1 TEST
2 2 TESTER
3 3 SET
4 4 ADD
5 4 DAD
6 5 SPAT
7 5 PAST
在表2中插入具有适当单词和索引引用的单词
这将是一个一对多关系->LetterInWord表中的一个条目在Word表中可能有多个条目
非通配符查找:
假设我的输入字母已设置
按字母顺序排列
然后在查找中,从LetterInWord中选择所有“字母”,其中字母=值并连接到表单词上-一个查询中的输出是仅包含这些字母的所有单词的列表
现在是通配符:
说我的输入字母是EST*
记住长度-4
去掉通配符-你得到EST(确保你按字母顺序排序)
现在查找字母包含EST和字母长度hi的所有情况,这相当于在字典中查找某些字母的所有排列(这很难),但是如果您在这里搜索排列,您将找到许多算法来获取字母的所有排列,那么您只需找到正确的子集。。。。(BTW:通配符使这更糟糕)第42部分,为什么每个CS学生都应该学习数据结构课程。你可以考虑为你的更新创建一些新的问题;你可能会对一个新问题更加关注。另外:我已经计划写一篇关于如何使用trie解决您的问题的博客文章一段时间了;我只是从来没有时间这么做。如果我真的发布了那篇文章,我会回到这里更新这个问题。如果你想对深度优先搜索的顺序进行排序,以匹配languagues字母表的分布,你可以更快地获得结果,甚至可以解决如何在磁盘上存储尝试的问题:。nets Lovely XML Serialization是你的朋友。如果你建立一个单词的trie按字母顺序排序,速度会快得多,不是吗?在您的示例中,trie将具有OP、OPS、OPST、OPSS、OPSST,每个单词的结束指针都指向其所有的字谜。然后,您必须为原始字符串的每个子集检查一次trie。如果我没有弄错的话,那就是O(2^n),其中n是机架中的字母数-对于7个标准机架来说,这不是问题,即使有巨大的字典。@configurator:您会注意到,我没有说该团队是否向我提供了报价。他们没有。(虽然这是一个没有实际意义的问题,因为团队在几周后解散了。)我没有被微软所有面试过我的团队录用;VB团队根据我的实习情况而不是面试情况向我提供了一份工作。@Joan:我的意思是面试官给招聘经理发了一封电子邮件,邮件的标题是“不雇用”,意思是“不要向这个家伙提供工作机会”。显然,那天我的采访并不顺利,不过一个有趣的缓解因素是那天下了一场暴风雪,本来要采访我的人都没有出现。有些面试官似乎有些措手不及。这是解决这个问题的一个非常典型的算法。当问题是“给定一个大小为n的机架,找到与机架完全匹配的所有n字母单词”时,它的性能非常好。不幸的是,当被问及“给定一个大小为n的机架,查找与机架匹配的所有n个或更少字母的单词”时,您的算法执行得很差。因为这是原始海报实际面临的问题,所以我不推荐这种算法。
^root^
/ | \
O P S
| | / \
P$ O \ T
/ \| \ |
| | \|
| | O
| T$ |
\ | P$
\ | /
\| /
| /
|/
S$
Index Letters
1 ESTT
2 ESTTER
3 EST
4 ADD
5 APST
Index LetterInWordIndex Word
1 1 TEST
2 2 TESTER
3 3 SET
4 4 ADD
5 4 DAD
6 5 SPAT
7 5 PAST