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