694.Number of Distinct Islands
1- DFS + HashSet+Stringbuilder
Using Relative Coordinate to form a String as HashKey
class Solution {
public int numDistinctIslands(int[][] grid) {
Set<String> set = new HashSet<>();
for(int i = 0; i < grid.length; i++){
for(int j = 0; j < grid[0].length; j++){
if(grid[i][j] != 0){
StringBuilder sb = new StringBuilder();
dfs(grid, i, j, i, j, sb);
grid[i][j] = 0;
set.add(sb.toString());
}
}
}
return set.size();
}
public void dfs(int[][] grid, int i, int j, int baseI, int baseJ, StringBuilder sb) {
if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == 0) return;
sb.append("<" + (i - baseI ) + "," + (j - baseJ) + ">");
grid[i][j] = 0;
dfs(grid, i + 1, j, baseI, baseJ, sb);
dfs(grid, i - 1, j, baseI, baseJ, sb);
dfs(grid, i, j - 1, baseI, baseJ, sb);
dfs(grid, i, j + 1, baseI, baseJ, sb);
}
}