【发布时间】:2017-07-07 18:00:11
【问题描述】:
我需要从二维数组创建所有可能的字符串,以便第一个字符来自charArray[0],第二个字符来自charArray[1]...最后一个字符来自charArray[keyLength-1]。
例子:
输入:
char[][] charArray =
{{'m','M','L','S','X'}
{'e','E','o','N','Z'}
{'o','G','F','r','Y'}
{'D','H','I','J','w'}};
输出:
{meoD, meoH, meoI,..., XZYJ, XZYw} //in an Array or ArrayList
我有一个可行的解决方案,它以@987654326@ 中的每个字符为根构建一棵树,并进行了深度优先的字符串构造,但 JVM 的 charArray 长度小于 12 时内存不足。我通常会采用迭代方法,但 charArray 长度(即密钥字符串长度)是在运行时决定的,我想找到一个比在密钥字符串长度上编写 switch 语句并手动写出有限数量的密钥字符串长度的循环更完整的解决方案.
我被困在程序的这一小部分上的时间比我想承认的要长,因此我们将不胜感激任何帮助!
【问题讨论】:
-
把代码放在这里就很容易理解了。
-
即使 charArray 是在运行时确定的,你也有数组的 .length 字段
-
@hhafeez 是的,但问题来自尝试处理数组中的字符。我能想到的最佳迭代解决方案需要最终嵌套循环内的行看起来像:keyArrayList.add(charArray[0].charAt(a)+charArray[1].charAt(b)+....+ charArray(keyLength-1).charAt(x)。也就是说我需要为每个charArray[i]手动编写一个charAt语句。如果charArray的长度变化很大,这显然会出现问题。如果你能想到一种不同的方式,我很高兴听到它。
-
@Leozeo。我很乐意详细说明任何事情以使事情更清楚,但我的程序总共大约 1000 行,所以发布整个内容似乎有点矫枉过正。在递归算法的代码方面,恐怕递归设计的可视化一直是我的一个弱点,所以我来到这里希望找到可以给我一些指点的人。该程序的目的是解决仅给定加密的 base 64 字符串的重复密钥 XOR 密码。一般来说,这是我的程序所做的:(在下一条评论中)
-
@Leozeo。 1. 使用汉明距离、重合指数、三元组和这些测试的最大公约数来检测最可能的密钥长度。 2. 将输入字符串分成大小为“key length”的块。 3. 重新排列块,这样我就有了一个包含每个块的所有第一个字符的块,一个包含每个块的所有第二个字符的块,依此类推。 4. 将每个块求解为单字符异或。 5. 对于每个块,使用卡方字符频率分析得分最高的字符很可能是该块的关键。
标签: java recursion multidimensional-array