【发布时间】:2017-01-14 22:41:15
【问题描述】:
我有一个谜题,玩家需要使用现有的 9 个字母单词的字母拼出尽可能多的单词。假设您有“瀑布”。取字母并重新排列,您可以制作出 wafer、flaw、left 等。
目前,我在我的单词列表中使用如下所示的表达式:
^(?:([waterfall])(?!.*?1)){1,9}$
但问题在于,这也允许只出现一次的字母被使用两次,例如 freeware(三个 E)和 tatter(三个 T)。
到目前为止,我只是在迭代我的单词列表并计算字母,确保建议的单词每个字母的计数不高于我的原始单词。但这似乎有点令人厌烦,我的直觉告诉我应该可以确保表达式实际上只使用每个字母一次(或两次,如 L,如果它在原词中出现两次)。
我查看了文档,但对我来说这一切都相当希腊化,并且想知道可爱的堆垛机是否有建议。
【问题讨论】:
-
仅澄清:
[waterfall]不查找单词waterfall,而是允许字符类的一个字母。它甚至可以重写为[aeflrtw]并允许使用相同的词(不幸的是,这并不能解决您的问题 :=))您正在寻找的内容称为 permutation。 -
你使用什么正则表达式方言?
-
我不认为正则表达式是一个合适的解决方案 - 您必须在单独的前瞻中检查每个字母的正确数量,例如您的示例
^(?!(.*w){2})(?!(.*a){3})(?!(.*t){2})(?!(.*e){2})(?!(.*r){2})(?!(.*f){2})(?!(.*l){3})[waterfl]+$。 -
我在 Unity 的 C# 中并使用 System.Text.RegularExpressions,不确定是哪种方言。