我需要創建將處理字典(dictionary.txt 檔案)的功能。目標是找到由兩個連接的較小單詞構成的所有六字母單詞,例如:
con vex => convex
tail or => tailor
we aver => weaver
當然,檔案中可能有一些不是 6 個字母長的單詞,但是可以使用簡單的方法輕松篩選出這些單詞:
def cleanup_file
file_data = File.read('dictrionary.txt').split
file_data.reject! { |word| word.size < 6 }
end
但現在問題來了——如何確定陣列中的其他字串是否由兩個相連的較小的單詞組成?
[編輯]
示例 dictionary.txt 檔案在這里
uj5u.com熱心網友回復:
僅在偽代碼解決方案中思考,但您應該:
- 迭代字典的每一行,并按每個單詞的長度將單詞存盤在 6 個不同的陣列中。
- 確保所有單詞都是小寫的,沒有重復,并且所有值都已排序,以便稍后您可以
.bsearch在陣列中正確使用。
- 確保所有單詞都是小寫的,沒有重復,并且所有值都已排序,以便稍后您可以
- 迭代長度為 6 的陣列(例如
convex)并在長度為 1 的陣列(c對于給定的示例)和長度為 5 的陣列 (onvex) 中查找當前單詞的第一個字符的匹配項。如果有匹配項,請保存單詞。- 然后繼續在 length-2 和 length-4 陣列中查找匹配項(
co以及nvex相應的)并保存匹配項。 - 最后,在長度為 3 的陣列(
con和vex)中查看字串的兩個部分并保存任何匹配 - 查找接下來的 6 個字符的字串,直到完成。
- 然后繼續在 length-2 和 length-4 陣列中查找匹配項(
很可能有更好的方法來解決這個問題,比如在第一次迭代中將每個單詞插入其對應的陣列中,使用.bsearch_index排序而不是在同一次迭代中插入重復項,但大部分作業量將在第二次迭代和二分搜索中O(log n)及時作業,所以我想它應該作業得足夠快。
uj5u.com熱心網友回復:
假設字典如下。
dictionary = [
"a", "abased", "act", "action", "animal", "ape", "apeman",
"art", "assertion", "bar", "barbed", "barhop", "based", "be",
"become", "bed", "come", "hop", "ion", "man"
]
我認為,像大多數字典一樣,dictionary是排序的。
首先計算以下哈希。
by_len = dictionary.each_with_object({}) do |w,h|
len = w.length
(h[len] ||= []) << w if len < 7
end
#=> {1=>["a"],
# 6=>["abased", "action", "animal", "apeman", "barbed",
# "barhop", "become"],
# 3=>["act", "ape", "art", "bar", "bed", "hop", "ion", "man"],
# 5=>["based"],
# 2=>["be"],
# 4=>["come"]}
每個鍵是一個字長 (1-6),每個值是一個單詞陣列,dictionary其長度是鍵的值。
接下來,我將定義一個輔助函式,該函式根據給定的單詞陣列 ( ) 是否包含給定單詞 ( )回傳true或回傳。falselistword
def found?(list, word)
w = list.bsearch { |w| w >= word }
w && w == word
end
例如:
found?(by_len[3], "art")
#=> true
found?(by_len[3], "any")
#=> false
參見Array#bsearch。
我們現在提取感興趣的詞:
by_len[6].select { |w| (1..5).any? { |i|
found?(by_len[i], w[0,i]) && found?(by_len[6-i], w[i..-1]) } }
#=> ["abased", "action", "apeman", "barbed", "barhop", "become"]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/328626.html
