问题描述
我了解的是,我们需要找到N + M的所有排列。 我坚持认为这可以帮助任何人在这里使用哪种数据结构。
static String[] getper(String str) {
// Todo Auto-generated method stub
if (str.length() == 0) {
String arr[] = { "" };
return arr;
}
char c = str.charat(0);
String restOfString = str.substring(1);
String[] rr = getper(restOfString);
int k = 0;
String result[];
// create array,not the base case
if (rr.length == 1 && rr[0] == "") {
result = new String[1];
} else {
result = new String[(rr[0].length() + 1) * rr.length];
}
for (int i = 0; i < rr.length; i++) {
System.out.println("for value:" + rr[i] + " inserting:" + c);
for (int j = 0; j <= rr[i].length(); j++) {
result[k] = rr[i].substring(0,j) + c + rr[i].substring(j);
k++;
}
}
return result;
}```
解决方法
为大的M
和N
生成大量的所有组合是不现实的。
但是我们可以计算出没有K+1
个相似糖果的情况下的变体数量。
为红色和蓝色糖果制作大小为(N+M+1)x(N+1)x(K+1)
和(N+M+1)x(M+1)x(K+1)
的桌子。
条目Red[i][r][j]
包含长度为i
的良好序列,最后以j
个红色糖果使用r
红色糖果结尾(我们需要限制红色糖果的总数)由N
)
类似于Blue[i][b][j]
我们可以计算出Red[i][r][j]
存在多少个好序列,向Blue[i-1][i-1-b-1]
行的任何单元格添加一个红色糖果。另外,我们可以为单元格Red[i-1][r-1][j<K]
添加一个红色糖果(所有以K
红色结尾的红色糖果)。
逐层填充红色和蓝色表,最后一层(Red[N+M] and Blue[N+M]
)的总和是变体的数量。