我的想法是创建一个工具,为一系列字符生成每个可能的字谜,为了数学,我将在这里使用数字(我将用它来表示给出的字符的索引)。
这个想法如下,输出应该在每个数字旁边看。
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();
}
答案 0 :(得分:0)
您可以将序列放在HashMap
中,然后借助HashMap中的contains()
方法检查该序列是否存在于HashMap中。由于BigO(N)用于在HashMap中进行搜索,因此操作成本不会太高。
答案 1 :(得分:0)
我今天自己解决了,答案可以在https://sourceforge.net/projects/anagramsolver/
找到