You dont need to normalize the path by the starting point. Keeping track of the move in the DFS is enough for island signature.

class Solution:
def numDistinctIslands(self, grid):
islands = set([])
for i in range(len(grid)):
for j in range(len(grid[i])):
if grid[i][j] == 1:
islands.add(self.dfs(grid, i, j, "s"))
return len(islands)
def dfs(self, g, i, j, path):
if i < 0 or j < 0 or i >= len(g) or j >= len(g[i]) or g[i][j] == 0:
return ""
g[i][j] = 0
return path \
+ self.dfs(g, i+1, j, "d") + "u" \
+ self.dfs(g, i-1, j, "u") + "d" \
+ self.dfs(g, i, j+1, "r") + "l" \
+ self.dfs(g, i, j-1, "l") + "r"