def valid_sudoku(board):
    row_sets = [set() for _ in range(9)]
    column_sets = [set() for _ in range(9)]
    boxes = [set() for _ in range(9)]
    for r in range(9):
        for c in range(9):
            digit = board[r][c]
            if digit == '.':
                continue
            box = (r // 3) * 3 + c // 3
            if digit in row_sets[r] or digit in column_sets[c] or digit in boxes[box]:
                return False
            row_sets[r].add(digit)
            column_sets[c].add(digit)
            boxes[box].add(digit)
    return True
