问题描述:Crypt kicker 算法是一种众所周知的加密算法,但安全性较低。这个UVa问题就是基于这种方法解密行。问题陈述如下:843 地穴踢球者加密文本的一种常见但不安全的方法是排列字母表中的字母。也就是说,在文本中,字母表中的每个字母始终被某个其他字母替换。为了保证加密是可逆的,没有两个字母被同一个字母代替。您的任务是解密几行编码的文本,假设每一行使用不同的替换集,并且解密文本中的所有单词都来自已知单词的字典。输入输入由一行包含整数 n 和 n 个小写单词组成,每行一个,按字母顺序排列。这 n 个单词构成了可能出现在解密文本中的单词词典。字典后面是几行输入。每行都按上述方式加密。字典里的单词不超过1000个。没有一个单词超过 16 个字母。加密行仅包含小写字母和空格,长度不超过 80 个字符。输出解密每一行并将其打印到标准输出。如果有多个解决方案,任何一个都可以。如果没有解决方案,请用星号替换字母表中的每个字母。样本输入6 and dick jane puff spot yertle bjvg xsb hxsn xsb qymm xsb rqat xsb pnetfn xxxx yyy zzzz www yyyy aaa bbbb ccc dddddd样本输出迪克和简和粉扑和斑点和耶尔特**** * **** * **** * **** * ******什么地方出了错?我创建了一个 Java 代码来解决它。我使用的算法如下图所示。代码似乎是正确的。它通过了我提供给它的所有测试用例,包括uDebug测试用例。但是,当将我的代码提交给 UVA 在线法官时,它总是返回给我错误的答案!谁能找出我的问题?代码是否有隐藏的缺陷?或者是在线判断问题?!任何帮助都受到高度赞赏!算法说明:解决这个问题的第一个想法是排列字母表中的所有字母以找到映射。然而,这个解决方案在计算上是巨大的。一个更好的想法是使用回溯。您可以将加密词映射到与加密词具有相同长度和模式的字典词。[ 显示单词模式的含义:'abc' 可能映射到 'her' 但是,它不能映射到 'see',因为模式不同“三个不同的字母单词不能映射到两个不同的字母单词”我接受了这个这个讨论的好主意]。如果您找到第一个单词的映射,则移动到下一个单词并映射它。如果第二个单词没有解决方案,则返回到第一个单词并尝试另一个映射,依此类推。如果没有合适的映射到第一个单词,则声明没有解决方案。对于映射,我首先映射最长的单词,因为它们更难映射。
2 回答
泛舟湖上清波郎朗
TA贡献1818条经验 获得超3个赞
主要问题似乎是您的程序无法解密(或对最后一行输入执行任何操作)。发生这种情况是因为在您已经阅读了将在该循环的迭代中处理的行之后c.hasNextLine()
评估循环条件。
此外,我观察到您解决了与挑战不同的问题,尽管是一个密切相关的问题。你应该
解密每一行
(强调),但你实际上做的是解密每一行的单词。输入描述不保证加密行没有前导或尾随空格,或者相邻单词之间不会有超过一个空格。如果其中任何一个发生,那么您的程序不会在其输出中重现它们。
此外,虽然我倾向于将问题描述理解为字典中的单词单独出现在它们的行上,没有任何前导或尾随空格,但如果实际情况并非如此,那么您阅读它们的方法将包括空格. 只需trim()
在输入上输入每个就可以很容易地防止这种情况发生。
我最大的风格批评是:不要在循环或if
或else
块的主体周围省略大括号,即使这些主体只包含一个语句。这样做会使您的代码更难阅读,并为未来的维护者设置陷阱,包括未来的您。在过去几年中,此类遗漏已成为至少一个备受瞩目的安全问题的原因。
添加回答
举报
0/150
提交
取消