我想得到排列的特定组合?

时间:2012-03-14 18:32:32

标签: java cryptography

我希望得到像字母表一样的字符串排列的特定组合。为了理解我,我将向您展示我使用的代码:

public class PermutationExample {

public static List<String> getPermutation(String input) {

    List<String> collection = null;

    if (input.length() == 1) {
        collection = new ArrayList<String>();
        collection.add(input);
        return collection;
    } else {
        collection = getPermutation(input.substring(1));
        Character first = input.charAt(0);
        List<String> result = new ArrayList<String>();
        for (String str : collection) {
            for (int i = 0; i < str.length(); i++) {
                String item = str.substring(0, i) + first
                        + str.substring(i);
                result.add(item);
            }
            String item = str.concat(first.toString());
            result.add(item);
        }
        return result;
    }

}

public static void main(String[] args) {
    System.out.println(PermutationExample.getPermutation("ABCD"));

}
}

这段代码效果很好,我可以得到每个组合,我可以从列表中取出它,如果我需要第5个元素,我可以收到它。但如果字符串是字母......,没有用,那就太大了。我要做的就是从所有26个中获得1221的特定元素!组合?

1 个答案:

答案 0 :(得分:1)

前一段时间我解决了类似的问题,只在python中解决了。

如果您需要的只是第n个排列,那么您可以做得更好,然后生成每个排列并返回第n个,如果您尝试仅考虑生成所需的排列。

你可以“简单地”通过弄清楚你想要的排列数量应该是前面的元素,然后是递归的剩余元素。

假设任何值的集合值[0,...,X],使得col [n]&lt; COL [N + 1] 对于N个元素,有N个!可能的排列,收集完全颠倒的情况。

我们将在每个(N-1)之后看到集合头部的变化!排列,所以如果n&lt; (N-1)!,头是头。然后,您有剩余的排列数,并且可以递归地应用相同的逻辑。

这有帮助吗?我知道这是相当高的水平,你必须考虑一下,但也许它会让你走上正确的轨道。