递归在这里可以提供帮助。假设您说这words(min, max, n)
会为您提供所有单词的列表,其中包含和n
之间的字符。你可以通过说 if 来实现它,唯一的词是空字符串;否则,您将通过将每个可能的字符附加到.min
max
n = 0
words(min, max, n - 1)
List<String> words(char min, char max, int n) {
List<String> ret = new ArrayList<String>();
if(n == 0) {
ret.add("");
return ret;
}
for(String word : words(min, max, n - 1)) {
for(char c = min; c <= max; ++c) {
ret.add(word + c);
}
}
return ret;
}
编辑:
迭代解决方案也生成小于请求长度的所有可能性:
List<String> words(char min, char max, int n) {
List<String> ret = new ArrayList<String>();
ret.add("");
int start = 0;
for(int length = 1; length <= n; ++length) {
int end = ret.size();
for(int i = 0; i < end; ++i) {
for(char c = min; c <= max; ++c) {
ret.add(ret.get(i) + c);
}
}
start = end;
}
return ret;
}
编辑:
如果您不想保存单词,则肯定需要递归,因为您基本上是使用堆栈代替列表:
void words(char min, char max, int n) {
for(int i = 0; i <= n; ++i) {
wordsRecursive("", min, max, i);
}
}
void wordsRecursive(String base, char min, char max, int n) {
if(n == 0) {
System.out.println(base);
} else {
for(char c = min; c <= max; ++c) {
wordsRecursive(base + c, min, max, n - 1);
}
}
}