classSolution { publicvoidsolve(char[][] board) { intm= board.length, n = board[0].length;
for (intj=0; j < n; j++) { dfs(board, m, n, 0, j); dfs(board, m, n, m - 1, j); } for (inti=0; i < m; i++) { dfs(board, m, n, i, 0); dfs(board, m, n, i, n - 1); }
for (inti=0; i < m; i++) { for (intj=0; j < n; j++) { if (board[i][j] == 'E') { board[i][j] = 'O'; } elseif (board[i][j] == 'O') { board[i][j] = 'X'; } } } }
privatevoiddfs(char[][] board, int m, int n, int i, int j) { if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] == 'X' || board[i][j] == 'E') { return; }
board[i][j] = 'E'; dfs(board, m, n, i + 1, j); dfs(board, m, n, i - 1, j); dfs(board, m, n, i, j + 1); dfs(board, m, n, i, j - 1); } }
publicvoidsolve(char[][] board) { intm= board.length, n = board[0].length;
UnionFindunionFind=newUnionFind(m * n + 1);
intdummy= m * n;
for (intj=0; j < n; j++) { if (board[0][j] == 'O') { unionFind.union(getIndex(n, 0, j), dummy); } if (board[m - 1][j] == 'O') { unionFind.union(getIndex(n, m - 1, j), dummy); } } for (inti=1; i < m - 1; i++) { if (board[i][0] == 'O') { unionFind.union(getIndex(n, i, 0), dummy); } if (board[i][n - 1] == 'O') { unionFind.union(getIndex(n, i, n - 1), dummy); } }
for (inti=0; i < m; i++) { for (intj=0; j < n; j++) { if (board[i][j] == 'O') { for (int[] direction : DIRECTIONS) { intnextI= i + direction[0]; intnextJ= j + direction[1]; if (nextI < m && nextJ < n && board[nextI][nextJ] == 'O') { unionFind.union(getIndex(n, i, j), getIndex(n, nextI, nextJ)); } } } } }
for (inti=1; i < m - 1; i++) { for (intj=1; j < n - 1; j++) { if (board[i][j] == 'O' && !unionFind.isConnected(getIndex(n, i, j), dummy)) { board[i][j] = 'X'; } } } }
privateintgetIndex(int width, int i, int j) { return i * width + j; } }