2016-09-07 55 views
1

我有一個難題,玩家需要使用現有的9個字母單詞的字母來製作儘可能多的單詞。假設你有「瀑布」。以字母和重新排列你可以使晶圓,缺陷,等。正則表達式來找到由字母集合組成的單詞

目前,我使用看起來像這樣我的單詞列表上的表達式:

^(?:([waterfall])(?!.*?1)){1,9}$ 

但問題是,這也允許只出現一次,信件使用兩次,像免費(三個Es)和破爛(三個Ts)。

截至目前,我只是迭代我的單詞列表和計算字母,確保建議的單詞不包含每個字母比我的原始單詞更高的計數。但是這似乎有點令人厭煩,我的直覺告訴我應該可以確保表達式實際上只使用每個字母一次(或兩次,如L,如果它在原始單詞中兩次)。

我已經瀏覽過文檔,但對我而言,這些都很希望,並且想知道可愛的堆垛機是否有建議。

+1

才澄清:'[瀑布]'不會查找單詞'waterfall'而是允許字符類的一個字母。它甚至可以被重寫爲'[aeflrtw]'並且允許相同的單詞(這很遺憾並不能解決你的問題,儘管:=))你正在尋找的是** **排列。 – Jan

+0

你使用哪種正則表達方言? – bwoebi

+2

我不認爲正則表達式是一個合適的解決方案 - 你必須檢查每個字母的正確數量在一個單獨的lookahead,像['^(?!(。* w){2})(?!( * A){3})(?!(。* T){2})(?!(。* E){2})(?!(。* R){2})(?!(。* f){2})(?!(。* l){3})[waterfl] + $'](https://regex101.com/r/fW3rK4/1)。 –

回答

3

你不應該使用它的正則表達式,每次都會維護或生成自定義正則表達式。您可以使用此方法:

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); 
} 
相關問題