情况如下:
我有36个字符可供选择,a-z和0-9。
char[] alphabet = "0123456789abcdefghijklmnopqrstuvwxyz".toCharArray();
使用索引,我们想要创建所有可能的长度为N的字符串,从N = 1到N = 2.
长度为1非常简单,
private String generateString(int index){
if (index < 36){
char word = alphabet[index];
return String.valueOf(word);
}
if ( index < 1332) {
//lost
}
}
但是如果我们想要长度为2,那么我们可以假设所有长度为2的单词的索引都是&gt; 36和&lt; 1332(36 +(36 ^ 2))。但我迷失在如何将这些索引与长度为2的单词联系起来,并确保所有可能的单词组合都被击中。
我认为有一种数学方法可以实现这一目标,但我只是没有看到它。
答案 0 :(得分:0)
我不确定我的问题是否正确。你想要各种字符串长度的所有字母组合(比如brute force attack)吗?那么这可能对你有帮助。
如果您的字母表仅由0-z
组成,那么您可以使用Java的Integer.toString()方法,提供36的基数,并进行一些计数和填充:
void start(int lengthFrom, int lengthTo) {
for (int length = lengthFrom; length <= lengthTo; length++) {
for (int i=0; i < Math.pow(36, length); i++) {
result(String.format("%" + length + "s", Integer.toString(i, 36)).replace(' ', '0'));
}
}
}
void result(String s) {
System.out.println(s);
}
如果您需要更灵活的字母表,请查看此代码。在这里你可以添加任何字符,因为它只是从左到右递归填充它们:
char[] alphabet = "0123456789abcdefghijklmnopqrstuvwxyz".toCharArray();
void start(int lengthFrom, int lengthTo) {
for (int length = lengthFrom; length <= lengthTo; length++) {
char[] chars = new char[length];
fill(chars, 0);
}
}
void fill(char[] chars, int pos) {
if (chars.length == pos) {
result(new String(chars));
return;
}
for (char c : alphabet) {
chars[pos] = c;
fill(chars, pos+1);
}
}
void result(String s) {
System.out.println(s);
}
此方法使用recursion。所有递归算法都可以转换为迭代算法;通常消耗更少的内存,但也不太容易阅读。
如果你想要一个&#34;索引&#34;对于你的字符串,你可以使用result()
方法构建它,因为传递的字符串是有序的。
答案 1 :(得分:0)
哦,你不是在谈论这个,对吗?
Integer.parseInt(word, 36);
Integer.toString(index, 36);
那样
Integer.parseInt("1z", 36); // int(71)
Integer.toString(71, 36); // "1z"
答案 2 :(得分:0)
对于两个字母的单词,通过将1d索引折叠为大小为36的2d,即创建映射[1,2,...,1296] -> ["00","01",...,"zz"]
。 [1,2,...,1296] -> [(1,1), (2,1), (3,1), ..., (36,36)]
:
private String generateTwoLetterString(final int index) {
if(index > 1296)
throw new IndexOutOfBoundsException("index is greater than 1296");
int j = (int) Math.ceil(index/36f);
int i = index % 36 == 0 ? 36 : index % 36;
return String.format("%s%s", alphabet[j-1], alphabet[i-1]);
}