方法一:记忆化dfs
class Solution { boolean[][] visited; public boolean containsCycle(char[][] grid) { int m = grid.length, n = grid[0].length; visited = new boolean[m][n]; for(boolean[] v : visited) Arrays.fill(v,false); if(m < 2 || n < 2) return false; for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { if(grid[i][j] == '.') continue; if(dfs(grid,i,j,m,n,grid[i][j],-1,-1)) return true; } } return false; } int[][] dir = {{0,1},{0,-1},{1,0},{-1,0}}; public boolean dfs(char[][] grid, int i, int j, int m, int n, char pre, int prex, int prey) { if(i < 0 || i >= m || j < 0 || j >= n || grid[i][j] != pre) return false; if(visited[i][j]) return true; visited[i][j] = true; for(int k = 0; k < 4; k++) { if(i + dir[k][0] == prex && j + dir[k][1] == prey) continue; if(dfs(grid,i+dir[k][0],j+dir[k][1],m,n,pre,i,j)) return true; } visited[i][j] = false; grid[i][j] = '.'; return false; } }
方法二:并查集
class Solution { int[] p; public boolean containsCycle(char[][] grid) { int m = grid.length, n = grid[0].length; p = new int[m*n]; for(int i = 0; i < n * m; i++) { p[i] = i; } for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { char c = grid[i][j]; if(i + 1 < m && grid[i+1][j] == c) { if(union(i*n+j,(i+1)*n+j)) return true; } if(j + 1 < n && grid[i][j+1] == c) { if(union(i*n+j,i*n+j+1)) return true; } } } return false; } public int find(int x) { if(x != p[x]) p[x] = find(p[x]); return p[x]; } public boolean union(int a, int b) { int fa = find(a), fb = find(b); if(fa != fb) { p[fa] = fb; return false; } return true; } }