用字典替换密码

时间:2012-01-29 20:17:46

标签: algorithm substitution encryption

我的家庭任务是根据已知的有限词典解读一个句子。

实施例: Dict - 显示,打击,而

然后代码12345 8291作为输入。 如果我们将检查可能性,唯一的选择是“while show”。

有些人可以给我一个方向或一个已知的算法来处理这个问题。 伪代码或java会很棒。

感谢

1 个答案:

答案 0 :(得分:0)

您需要实现某种回溯或其他搜索技术。我建议采用以下方法:

  1. 创建一个密码到字符的翻译表。最初,每个密码(数字)映射到0(无)。
  2. 处理输入。每次遇到未分配的密码数字时,您都可以选择基于字典的字母以及到目前为止所确定的内容。如果没有可分配的字母,则回溯(或以任何对您的搜索技术有意义的报告失败)。将每个选项添加到搜索控制逻辑中。 (例如,如果您正在使用回溯,请保存选项列表并在转换表中记录任意选择。如果您回溯到该点,请指定另一个选项。)
  3. 继续进行,直到你结束或者你没有选择。
  4. 编辑:在步骤2中,困难的部分是确定可以将哪些字母(如果有的话)分配给下一个密码数字。假设我们正在跟踪解码的当前字,并且我们想要处理字中的下一个密码数字。我们已经制作了密码数字分配的全球地图。逻辑可能是这样的(在Java-ish伪代码中):

    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;
    }
    

    如果返回空集,则当前分配(在调用方法之前)与字典不兼容,搜索必须回溯。否则,搜索应该从集合中一次选择一个作业并继续,根据需要进行回溯。

    不是尝试每个未分配的字符并询问字典是否兼容,而是直接查询字典以查找兼容的下一个字符列表并将其与未分配的字符集相交,这可能更有效(但在逻辑上等效)。 / p>