Вы могли бы думать об этом как о подсчете, с основанием, равным количеству символов в алфавите (особенно заботясь о нескольких равных символах в алфавите, если это возможно). Например, aaaa aaab aaba ...
пример - это двоичное представление чисел 0-15.
Просто выполните поиск радикальных преобразований, осуществите сопоставление от каждой "цифры" до соответствующего символа, а затем просто выполните цикл for от 0 до длины_символа alphabet_size
Такой алгоритм должен работать во времени, линейно пропорциональном количеству строк, которые должны быть получены с использованием постоянного объема памяти.
Демонстрация на Java
public class Test {
public static void main(String... args) {
// Limit imposed by Integer.toString(int i, int radix) which is used
// for the purpose of this demo.
final String chars = "0123456789abcdefghijklmnopqrstuvwxyz";
int wordLength = 3;
char[] alphabet = { 'a', 'b', 'c' };
for (int i = 0; i < Math.pow(wordLength, alphabet.length); i++) {
String str = Integer.toString(i, alphabet.length);
String result = "";
while (result.length() + str.length() < wordLength)
result += alphabet[0];
for (char c : str.toCharArray())
result += alphabet[chars.indexOf(c)];
System.out.println(result);
}
}
}
выход:
aaa
aab
aac
aba
abb
abc
aca
acb
acc
baa
bab
bac
bba
bbb
bbc
bca
bcb
bcc
caa
cab
cac
cba
cbb
cbc
cca
ccb
ccc