有什么方法可以将索引与N长度字符串相关联?

时间:2014-03-25 18:06:00

标签: java

情况如下:

我有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的单词联系起来,并确保所有可能的单词组合都被击中。

我认为有一种数学方法可以实现这一目标,但我只是没有看到它。

3 个答案:

答案 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]);
}