36. Valid Sudoku (Medium) - TengnanYao/daily_leetcode GitHub Wiki

class Solution(object):
    def isValidSudoku(self, board):
        """
        :type board: List[List[str]]
        :rtype: bool
        """
        h = {}
        for i in range(9):
            for j in range(9):
                k = board[i][j]
                if k != ".":
                    k1, k2, k3 = (i, k), (k, j), (i // 3, j // 3, k)
                    if k1 in h or k2 in h or k3 in h:
                        return False
                    h[k1] = 1
                    h[k2] = 1
                    h[k3] = 1
        return True
                    
        # my original solution
        zipboard = zip(*board)
        blocks = [[] for i in range(9)]
        for i in range(9):
            for j in range(9):
                k = i // 3 * 3 + j // 3
                blocks[k].append(board[i][j])
        for i in range(9):
            row, col, block = [], [], []
            for j in range(9):
                r, c, b = board[i][j], zipboard[i][j], blocks[i][j]
                if r in row or c in col or b in block:
                    return False
                if r != ".":
                    row.append(r)
                if c != ".":
                    col.append(c)
                if b != ".":
                    block.append(b)
        return True