我有一个谜题,玩家需要使用现有的 9 个字母单词中的字母来拼出尽可能多的单词。假设您有“瀑布”。把字母重新排列,你可以得到wafer、flaw、left等。
目前,我在我的单词列表中使用了一个看起来像这样的表达:
^(?:([waterfall])(?!.*?1)){1,9}$
但问题是,这也允许只出现一次的字母被使用两次,例如 freeware(三个 E)和 tatter(三个 T)。
截至目前,我只是简单地迭代我的单词列表并计算字母数量,确保建议的单词包含的每个字母的数量不会高于我的原始单词。但这似乎有点令人厌烦,我的直觉告诉我应该可以确保表达式实际上只使用每个字母一次(或者两次,如 L,如果它在原始词中出现两次)。
我已经查看了文档,但对我来说这一切都很糟糕,想知道可爱的堆垛机是否有建议。
请您参考如下方法:
你不应该为它使用正则表达式,每次维护或生成自定义正则表达式都是 hell 。你可以使用这个方法:
public static bool checker(string big, string small)
{
Dictionary<char, int> letterCount = new Dictionary<char, int>();
foreach (char c in big)
{
if (!letterCount.ContainsKey(c))
{
letterCount[c] = 0;
}
letterCount[c]++;
}
return small.All(letter => letterCount.ContainsKey(letter) && --letterCount[letter] >= 0);
}
