ultra-mega-enumerator
Version:
Ultra Mega Enumerator is a lightweight library designed to enumerate various combinatorial objects.
53 lines • 1.74 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.NonCrossingPartitionEnumeration = void 0;
const AbstractEnumeration_1 = require("./AbstractEnumeration");
const DyckWordEnumeration_1 = require("./DyckWordEnumeration");
class NonCrossingPartitionEnumeration extends AbstractEnumeration_1.AbstractEnumeration {
constructor(n) {
super();
this.dwe = new DyckWordEnumeration_1.DyckWordEnumeration(n);
}
hasMoreElements() {
return this.dwe.hasMoreElements();
}
nextElement() {
if (!this.hasMoreElements()) {
throw new Error("No such element");
}
return this.dyckToPartition(this.dwe.nextElement());
}
dyckToPartition(s) {
const n = s.length / 2;
const stack = [];
const matchingClose = new Map();
const closeLabel = new Map();
let rising = true;
let k = 0;
for (let i = 0; i < 2 * n; i++) {
if (s.charAt(i) === '(') {
stack.push(i);
rising = true;
}
else {
const match = stack.pop();
matchingClose.set(match, i);
if (rising) {
rising = false;
k++;
}
closeLabel.set(i, k - 1);
}
}
const o = new Array(n);
let j = 0;
for (let i = 0; i < 2 * n; i++) {
if (s.charAt(i) === '(') {
o[j++] = closeLabel.get(matchingClose.get(i));
}
}
return o;
}
}
exports.NonCrossingPartitionEnumeration = NonCrossingPartitionEnumeration;
//# sourceMappingURL=NonCrossingPartitionEnumeration.js.map