找到所有长度的字符串

时间:2016-06-04 15:16:16

标签: java string recursion

给定一个类密码,所有密码只能用英文字母的小写字母书写,我想写一个递归找到密码的算法,通过查看所有可能的密码相同的长度。

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

让我们调用此方法public static String findPassword(Password p, int length)

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

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

我目前的问题是将其中的一些想法转化为代码,我想在没有任何for循环的情况下这样做。

1 个答案:

答案 0 :(得分: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进展到{{{}时,只有一次递归调用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
  • 的26个字符串
  • n=1
  • 的676个字符串
  • n=2
  • 的17,576个字符串
  • n=3
  • 的456,976个字符串
  • n=4
  • 的11,881,376个字符串
  • 越来越差......