694. Number of Distinct Islands

24 阅读1分钟

image.png

image.png

方法:dfs

  • dfs的时候,记录搜索的路径,比如:上下左右
  • 注意一种情况,有时候不同的岛屿,路径是一样的。
    • 这是由于在不同位置回溯造成的,所以也要记录在哪里进行的回溯。

image.png

image.png

class Solution {
    StringBuilder sb;
    public int numDistinctIslands(int[][] grid) {
        int m = grid.length, n = grid[0].length;
        Set<String> set = new HashSet<>();
        boolean[][] visited = new boolean[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 1 && !visited[i][j]) {// not visited
                    // 每次dfs都记录搜索路径
                    sb = new StringBuilder(); 
                    dfs(grid, i, j, ' ', visited);
                    set.add(sb.toString());
                }
            }
        }
        return set.size();
    }

    public void dfs(int[][] grid, int i, int j, char dir, boolean[][] visited) {
        int m = grid.length, n = grid[0].length;
        if (i >= m || i < 0 || j >= n || j < 0) {
            return;
        }
        if (visited[i][j] || grid[i][j] != 1) {
            return;
        }

        visited[i][j] = true;
        sb.append(dir);
        dfs(grid, i + 1, j, 'D', visited);
        dfs(grid, i - 1, j, 'U', visited);
        dfs(grid, i, j + 1, 'R', visited);
        dfs(grid, i, j - 1, 'L', visited);
        sb.append('E'); // need to record where we backtracked, see examples

    }
}