我知道这是一条古老的线索,但有些人可能会回来。我有一个很难实现aioobe的解决方案,因为我认为它忽略了一步:
3.1),如果选择 “)”,则K = K - countValid(N-1,深度+ 1)
直观推理是这样的。如果您选择减小深度,则您要查找的序列位于搜索空间的第二部分(N,深度处)。如果我们保持k相同,它将沿着路径的某个点比所有剩余的解决方案的数量更大,并且我们的遍历不再起作用。我们需要减去我们排除的方法遍历矩阵的次数,以产生所需的结果。
这里是如果有包含有效序列的数目为每个(N,深度)矩阵d求出第k个元素一些Java代码:
// get k-th element
int N = 2*n;
int d = 0;
String str = new String("");
while (N>0 && d >= 0) {
// invalid elements (out of bounds or 0)
if (d+1 > n || D[N-1][d+1] == 0) {
str += ")"; d--;
} else if (d-1 < 0 || D[N-1][d-1] == 0) {
str += "("; d++;
} else {
if (k <= D[N-1][d+1]) {
// first part of search-space
str += "("; d++;
} else {
// second part of search-space
str += ")";
k -= D[N-1][d+1]; // substract number of excluded solutions
d--;
}
}
N--;
}
// For valid strings k should be 1
if (k != 1) str = "Doesn't Exist!";