我的想法是创建一个工具,为一系列字符生成每个可能的字谜,为了数学起见,我将在这里使用数字(我将用它来指示给定字符的索引)。
思路如下,输出应如每个数字旁边所示。
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();
}