0

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

思路如下,输出应如每个数字旁边所示。

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();
    }
4

2 回答 2

0

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

于 2013-06-15T19:00:26.730 回答
0

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

于 2013-06-17T11:48:55.933 回答