簡體   English   中英

用另一組字母檢查單詞中的字母的算法和數據結構

[英]Algorithm and Data Structure for Checking letters in a word with another set of letters

我有一個200,000字的字典和一組字母。 我需要一個算法來檢查一個單詞的所有字母是否都在那組字母中。 一個接一個地檢查單詞很慢。 因為需要處理大量的單詞,所以我需要一個數據結構來完成這項工作。 有任何想法嗎? 謝謝!

例如:我有一組字母{b,g,e,f,t,u,i,t,g,n,c,m,m,w,c,s},我想檢查單詞是否“大” “和”buff“。 所有“大”的字母都是原始集的子集,然后“大”是我想要的,而“buff”不是我想要的,因為原始集合中只有一個“f”。 這就是我想要做的。

這是針對Scrabble或Boggle的,對吧? 那么,你要做的是通過每個單詞中的字母進行排序來預生成你的字典。 所以, word就變成了dorw 然后將所有這些推入Trie數據結構中。 所以,在你的Trie中,序列dorw將指向值word

[請注意,因為我們對單詞進行了排序,所以它們會失去唯一性,因此一個排序單詞可以指向多個不同的單詞。 你的Trie需要在其數據節點上存儲列表或數組]

如果您需要在以后快速加載它而不進行所有排序步驟,則可以保存此結構。

你接下來要做的就是輸入你的輸入信件並對它們進行排序。 然后你開始遞歸地走過你的Trie。 如果當前字母與Trie中的現有路徑匹配,則按照它進行操作。 因為您可以使用未使用的字母,所以您也可以刪除當前的字母。

就這么簡單。 每當你在Trie中遇到一個有一個值的節點時,你就可以用你用來到那里的字母來表達。 您只需在找到它們時將這些單詞添加到列表中,並且在遞歸完成后,您已找到所有可能的單詞。

如果輸入中有重復的字母,則可能需要額外的邏輯來防止給出同一個單詞的多個實例(除非你想要這樣)。 在“遺漏”一封信(您只是跳過所有重復的字母)到下一個字母的步驟中,可以調用該邏輯。


[編輯]你似乎想做相反的事情。 我上面的解決方案找到了所有可能由一組字母組成的單詞。 但是你想測試一個特定的單詞,看看它是否允許,給定你的字母集。

這很簡單。

將可用字母存儲為直方圖。 也就是說,對於每個字母,您存儲您擁有的數字。 然后,您可以瀏覽測試單詞中的每個字母,隨時構建新的直方圖。 只要您的一個直方圖存儲桶超過可用字母中的值,就無法生成該字。 如果你一直到最后,你可以成功地說出這個詞。

您可以使用數組來標記字母集。 數組中的每個元素代表一個字母。 要將字母轉換為元素位置,只需要減去“a”或“A”的ASCII碼。 然后第一個元素代表'a',然后第二個元素代表'b',依此類推。 然后第27個是'A'。 元素值代表事件的發生。 例如,數組{2,0,1,0,...}代表類似{a,c,a}。 偽代碼可以是:

for each word
        copy the array to a new one
        for each letter in the word
            get the element position of the letter: position = letter - 'a'
            decrease the element value in the new array by one: new_array[position]--
            if the value is negative, return not found: if array[position] < 0  {return not found;}

對集合進行排序,然后對每個單詞進行排序並執行“合並”類操作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM