UNPKG

ultra-mega-enumerator

Version:

Ultra Mega Enumerator is a lightweight library designed to enumerate various combinatorial objects.

53 lines 1.74 kB
"use strict"; 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