class Solution:
def containsCycle(self, grid: List[List[str]]) -> bool:
"""tc O(R*C) sc O(R*C)
"""
hasCycle = False
seen = set()
r = len(grid)
c = len(grid[0])
def dfs(i,j,pre,seen,char):
res = False
seen.add((i,j))
for x,y in [(i+1,j),(i-1,j),(i,j+1),(i,j-1)]:
if 0<=x<r and 0<=y<c:
if x != pre[0] or y != pre[1]:
if grid[x][y] == char:
if (x,y) in seen:
#print(f'i {i} j {j}, char {char}, pre {pre} {seen}')
return True
else:
res |= dfs(x,y,(i,j),seen,char)
return res
for i in range(r):
for j in range(c):
if (i,j) not in seen:
pre = (-1,-1)
hasCycle |= dfs(i,j,pre,seen,grid[i][j])
return hasCycle