生成可变数字序列而不重复

时间:2013-06-15 18:50:16

标签: java math numbers sequences anagram

我的想法是创建一个工具,为一系列字符生成每个可能的字谜,为了数学,我将在这里使用数字(我将用它来表示给出的字符的索引)。

这个想法如下,输出应该在每个数字旁边看。

n = 1:0

n = 2:0; 01; 1; 10

n = 3:0; 01; 02; 012; 021; 1; 10; 12; 102; 120; 2; 20; 21; 201; 210

(并继续沿着这一趋势继续前进)

我可以生成多次出现数字的序列,但问题是这会产生大量开销,因为错误的数量呈指数级增长,这会导致大量开销,因此请检查序列包含重复项是没有选择的。

有人有想法吗? (您将在下面找到用于生成我在Java中使用的重复项的序列的代码)

public Set<String> generatePossibleAnagrams(String inputString) {
        char[] input = inputString.trim().toUpperCase().toCharArray();
        Arrays.sort(input);
        Set<String> anagrams = new TreeSet<String>();
        int currentLength = 1;

        while (currentLength <= input.length) {
            int[] indices = new int[currentLength];
            for (int i = 0; i < currentLength; i++) {
                indices[i] = 0;
            }

            boolean hadAllPossibilities = false;

            while (!hadAllPossibilities) {
                anagrams.add(generateCurrent(input, indices));

                indices[0]++;

                for (int i = 0; i < currentLength; i++) {
                    if (indices[i] >= input.length) {
                        indices[i] = 0;
                        if (i + 1 < currentLength) {
                            indices[i + 1]++;
                        } else {
                            hadAllPossibilities = true;
                        }
                    }
                }
            }

            currentLength++;
        }


        return Collections.unmodifiableSet(anagrams);
    }

private String generateCurrent(char[] input, int[] indices) {
        StringBuilder builder = new StringBuilder();

        for (int i = 0; i < indices.length; i++) {
            builder.append(input[indices[i]]);
        }

        return builder.toString();
    }

2 个答案:

答案 0 :(得分:0)

您可以将序列放在HashMap中,然后借助HashMap中的contains()方法检查该序列是否存在于HashMap中。由于BigO(N)用于在HashMap中进行搜索,因此操作成本不会太高。

答案 1 :(得分:0)

我今天自己解决了,答案可以在https://sourceforge.net/projects/anagramsolver/

找到