Java 查找所有长度的字符串
给定一个包含所有密码的类密码,这些密码只能用英文字母表中的小写字母书写,我想编写一个算法,通过遍历所有可能的相同长度的密码,递归地查找密码 类密码有一个方法Java 查找所有长度的字符串,java,string,recursion,Java,String,Recursion,给定一个包含所有密码的类密码,这些密码只能用英文字母表中的小写字母书写,我想编写一个算法,通过遍历所有可能的相同长度的密码,递归地查找密码 类密码有一个方法public boolean isPassword(String st),它比较给定密码p和字符串st,并返回它们是否相等的布尔值 让我们调用这个方法公共静态字符串findPassword(密码p,int-length) 我的想法是通过两个递归调用来实现这一点——一个调用长度为p,并使用方法charAt(i)在字符串alphabet=“abc
public boolean isPassword(String st)
,它比较给定密码p和字符串st,并返回它们是否相等的布尔值
让我们调用这个方法公共静态字符串findPassword(密码p,int-length)
我的想法是通过两个递归调用来实现这一点——一个调用长度为p,并使用方法charAt(i)
在字符串alphabet=“abcd…..z”
上连续添加字母表中的字符,直到它得到一个长度与p(意思是长度)相同的字符串
第二个递归调用将继续对字母表中的字母进行调用,每次将字母添加到前一个字符串中时都会进行更改,从而创建新的字符串。例如,给定一个长度为L
的字符串st
,我们将首先添加字母a,然后添加字母b,依此类推,直到到达z,从长度为L
的字符串移动到长度为L+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
的动态值硬编码嵌套循环的数量,所以您可以使用递归,正如您所说的,但是在从1
到n
的过程中,只有一个递归调用
这意味着递归方法需要接收两个参数:到目前为止的字符串和要添加的剩余字母数
在最深的递归调用中,即不再需要添加字母时,打印结果
以下是伪代码:
method(String textSoFar, int lettersLeft) {
if (lettersLeft == 0)
print textSoFar
else
for each letter in alphabet:
method(textSoFar + letter, lettersLeft - 1)
}
您可以通过调用方法(“,n)
来启动递归
请记住,您不能返回字符串,因为您将生成大量字符串以增加n
的值:
- 26个字符串,用于
n=1
- 676个字符串,用于
n=2
- 17576个字符串,用于
n=3
- 456976字符串,用于
n=4
n=5的11881376个字符串
- 而且越来越糟
您应该展示一个示例,其中包含示例输入和预期输出。是的,我同意。我发现要准确理解你的函数应该做什么有点困难。你在标题中也会说“比较”,但在实际问题中却没有。您是否试图生成包含字母表每个排列的长度为n的所有字符串?关于您的编辑,如果您不知道程序将接受什么输入以及它应该输出什么,那么您如何知道您正在做什么以及何时做,因为您不知道应该输出什么?这毫无意义。再想一想;-)示例输出的意思是:例如,当n=3
时,函数应该返回什么。您会说:“它创建了所有长度为n的字符串,其中包含所描述的字母表”,所以您想输出一组字符串?只有一根绳子?另外,我似乎找不到所描述的部分你知道你会得到很多输出,对吗?字符串的数量是26^n
,因此676
对于n=2
,17576
对于n=3
,456976
对于n=4
,11881376
对于n=5
,情况会越来越糟。一个问题是,有没有办法在else中改为for循环为递归,如果不使用26种不同的递归,“对于字母表中的每个字母”是一个for
循环。
method(String textSoFar, int lettersLeft) {
if (lettersLeft == 0)
print textSoFar
else
for each letter in alphabet:
method(textSoFar + letter, lettersLeft - 1)
}