【问题标题】:Finding all Strings of Length查找所有长度的字符串
【发布时间】:2016-06-04 15:16:16
【问题描述】:

给定一个类密码,所有密码只能用英文字母的小写字母编写,我想编写一个算法,通过遍历所有可能的密码来递归地找到密码长度。

Password 类有一个方法public boolean isPassword(String st),它比较给定的密码 p 和字符串 st 并返回它们是否相等的布尔值。

让我们将此方法称为public static String findPassword(Password p, int length)。

我的想法是在两个递归调用中执行此操作 - 一个持续 p 的长度,并使用方法 charAt(i) 在字符串 alphabet="abcd.....z" 上不断添加字母表中的字符,直到它同时获得一个字符串长度为 p(表示长度)。

第二次递归调用将通过每次更改它添加到前一个字符串的字母来创建新字符串。例如,给定一个长度为L 的字符串st,我们将首先添加字母a,然后添加字母b,依此类推,直到我们到达z,从长度为L 的字符串移动到长度@ 987654328@.

我目前的问题是将其中一些想法转换为代码,我想在没有任何 for 循环的情况下执行此操作。

【问题讨论】:

  • 您应该展示一个带有示例输入和预期输出的示例。
  • 是的,我同意。我发现要准确理解您的功能应该做什么有点困难。您还在标题中说“比较”,但在实际问题中却没有。您是否尝试生成包含字母表每个排列的所有长度为 n 的字符串?
  • 关于你的编辑,如果你不知道你的程序将接受什么输入以及它应该输出什么,那么你怎么知道你在做什么以及什么时候完成,因为你不知道不知道输出应该是什么?这是没有意义的。再想一想;-)
  • 通过示例输出我们的意思是:函数应该返回什么例如n=3。您说:“它创建了所有长度为 n 的字符串,其中包含所描述的字母表”,所以您想输出一组字符串?只有一根弦?另外,我似乎找不到as described 部分
  • 您确实意识到您将获得 LOT 的输出,对吗?字符串的数量是26^n,所以676 对应于n=2,17,576 对应于n=3,456,976 对应于n=4,11,881,376 对应于n=5,并且从那里开始变得更糟。

标签: java string recursion


【解决方案1】:

如果你用简单的for 循环来做,你会这样做:

// For n=1
for (int i = 0; i < 26; i++)
    System.out.println(alphabet.substring(i, i + 1));

// For n=2
for (int i = 0; i < 26; i++)
    for (int j = 0; j < 26; j++)
        System.out.println(alphabet.substring(i, i + 1) +
                           alphabet.substring(j, j + 1));

// For n=3
for (int i = 0; i < 26; i++)
    for (int j = 0; j < 26; j++)
        for (int k = 0; k < 26; k++)
            System.out.println(alphabet.substring(i, i + 1) +
                               alphabet.substring(j, j + 1) +
                               alphabet.substring(k, k + 1));

等等。这将为n=3 生成以下内容:

aaa
aab
aac
...
aaz
aba
...
zzz

现在,由于您无法对 n 的动态值的嵌套循环数进行硬编码,因此您可以使用递归,正如您所说,但当您从 1 前进到 n 时只有一个递归调用。

这意味着递归方法需要接收两个参数:到目前为止的字符串,以及要添加的字母数。

在最深的递归调用中,即不需要添加更多字母时,打印结果。

这是伪代码:

method(String textSoFar, int lettersLeft) {
    if (lettersLeft == 0)
        print textSoFar
    else
        for each letter in alphabet:
            method(textSoFar + letter, lettersLeft - 1)
}

您通过调用method("", n) 来启动递归。

请记住,您不能返回字符串,因为您将构建大量字符串来增加n 的值:

  • n=1 的 26 个字符串
  • n=2 的 676 个字符串
  • n=3 的 17,576 个字符串
  • n=4 的 456,976 个字符串
  • n=5 的 11,881,376 个字符串
  • 而且越来越糟……

【讨论】:

  • 一个问题 - 有没有办法在不使用 26 种不同递归的情况下将 else 中的 for 循环更改为递归?
  • “对于字母表中的每个字母”是一个for循环。
猜你喜欢
  • 1970-01-01
  • 2013-12-14
  • 2017-06-13
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多