36. Valid Sudoku - cocoder39/coco39_LC GitHub Wiki

36. Valid Sudoku

class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        row_set = [set() for i in range(9)]
        col_set = [set() for i in range(9)]
        box_set = [set() for i in range(9)]

        for i in range(len(board)):
            for j in range(len(board[0])):
                if board[i][j] != '.':
                    if board[i][j] in row_set[i]:
                        return False
                    row_set[i].add(board[i][j])
                    
                    if board[i][j] in col_set[j]:
                        return False
                    col_set[j].add(board[i][j])
                    
                    box_id = i // 3 * 3 + j // 3
                    if board[i][j] in box_set[box_id]:
                        return False
                    box_set[box_id].add(board[i][j])
        return True
class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        m, n = len(board), len(board[0])
        for i in range(m):
            for j in range(n):
                if board[i][j] == '.':
                    if not self.isValid(board, i, j):
                        return False
        return True
    
    def isValid(self, board, row, col) -> bool:
        # row check
        counter = [0 for _ in range(9)]
        for i in range(9):
            val = board[row][i]
            if val != '.':
                idx = ord(val) - ord('1')
                counter[idx] += 1
                if counter[idx] > 1:
                    return False
        
        counter = [0 for _ in range(9)]
        for i in range(9):
            val = board[i][col]
            if val != '.':
                idx = ord(val) - ord('1')
                counter[idx] += 1
                if counter[idx] > 1:
                    return False
        
        counter = [0 for _ in range(9)]
        r, c = row//3*3, col//3*3
        for i in range(r, r+3):
            for j in range(c, c+3):
                val = board[i][j]
                if val != '.':
                    idx = ord(val) - ord('1')
                    counter[idx] += 1
                    if counter[idx] > 1:
                        return False
        return True