1
// this is a very common disjoint set implement3
var root = [...new Array(n).keys()];4
var rank = new Array(n).fill(0);5
this.find = function (v) {6
if (root[v] !== v) root[v] = this.find(root[v]);9
this.union = function (i, j) {10
var [ri, rj] = [this.find(i), this.find(j)];11
if (ri === rj) return;12
if (rank[ri] > rank[rj]) root[rj] = ri;13
else if (rank[ri] < rank[rj]) root[ri] = rj;14
else (root[ri] = rj), rank[rj]++;16
// get how many unique unions17
this.getUnoinCount = function () {18
for (var i = 0; i < n; i++) this.find(i);19
return new Set(root).size;23
function getKeys(i, j, n) {26
// left and right part key of grid[i][j]27
return [val, val + 1];31
* @param {string[]} grid34
var regionsBySlashes = function (grid) {36
if (n === 1) return grid[0][0] === " " ? 1 : 2;37
var ds = new DS(n * n * 2);38
for (var i = 0; i < n; i++) {39
for (var j = 0; j < n; j++) {40
var [left, right] = getKeys(i, j, n);41
// When this cell is ' ', union left and right.42
if (grid[i][j] === " ") ds.union(left, right);43
// if have upper neighbor45
var [upLeft, upRight] = getKeys(i - 1, j, n);46
// For upper neighbor, if it's '/', we should choose right part to union, if '\', choose left.47
var upKey = grid[i - 1][j] === "\\" ? upLeft : upRight;48
// For current cell, if it's '/', we should choose left part to union, if '\', choose right.49
var curKey = grid[i][j] === "/" ? left : right;50
ds.union(upKey, curKey);52
// if have left neighbor54
var [leftLeft, leftRight] = getKeys(i, j - 1, n);55
// just choose the right part of the left neighbor56
var leftKey = leftRight;57
// just choose the left part of the current cell59
ds.union(leftKey, curKey);63
return ds.getUnoinCount();