0
我家的任務是基於已知和有限字典破譯一個句子。替換密碼與字典
實施例: 字典 - 顯示,吹塑,而
則代碼12345 8291來作爲輸入。 如果我們將檢查的可能性唯一的選擇是「while show」。
有人可以給我一個方向或一個已知的算法來處理這個問題。 僞代碼或java會很好。
感謝
我家的任務是基於已知和有限字典破譯一個句子。替換密碼與字典
實施例: 字典 - 顯示,吹塑,而
則代碼12345 8291來作爲輸入。 如果我們將檢查的可能性唯一的選擇是「while show」。
有人可以給我一個方向或一個已知的算法來處理這個問題。 僞代碼或java會很好。
感謝
您需要實現某種回溯或其他搜索技術。我建議採用以下方法:
編輯:在步驟2中,困難的部分是確定什麼字母(如果有的話)可以分配給下一個密碼數字。假設我們正在跟蹤解碼的當前單詞,並且我們想要處理單詞中的下一個密碼數字。我們已經制作了密碼數字分配的全球地圖。邏輯可能是這樣的(在Java中上下的僞代碼):
Set assignableLetters(String wordSoFar, int nextCipher) {
Character assignment = map.get(nextCipher);
Set set = new Set();
if (assignment != null) {
// The next cipher is already assigned. Add the assignment to the
// return set only if it is compatible with the dictionary contents
if (dictionary.hasWordsWithPrefix(wordSoFar + assignment)) {
set.add(assignment);
}
} else {
// The next cipher is not assigned. We will return a set of all
// compatible characters that can be assigned to it.
for (Character c : unassignedCharacters()) {
if (dictionary.hasWordsWithPrefix(wordSoFar + c)) {
set.add(c);
}
}
}
return set;
}
如果返回空集,當前分配(被稱爲方法之前)與字典不兼容,搜索必須原路返回。否則,搜索應該從集合中一次選擇一個任務並繼續,必要時回溯。
而不是嘗試每個未分配的字符並詢問字典是否兼容,它可能更有效(但在邏輯上相當於)直接查詢字典中的兼容下一個字符列表並與未分配的字符集相交。
它是如何考慮我們在字典中的詞彙? – user1176889 2012-01-29 21:28:03
@ user1176889這將確定新的密碼數字可能包含哪些字母分配(如果有)。分配必須與字典和目前閱讀的內容保持一致。另外,如果下一個密碼已經分配完畢,必須查閱字典以確定下一個字母是否可能出現。 (我忽略了在我的答案中提到最後一點。) – 2012-01-29 22:08:02
感謝您的回答。你能給出更詳細的解釋嗎? – user1176889 2012-02-05 18:40:33