# 36. Valid Sudoku

• Time: $O(1)$
• Space: $O(1)$
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Solution { public: bool isValidSudoku(vector>& board) { unordered_set seen; for (int i = 0; i < 9; ++i) for (int j = 0; j < 9; ++j) { if (board[i][j] == '.') continue; const string c(1, board[i][j]); if (!seen.insert(c + "@row" + to_string(i)).second || !seen.insert(c + "@col" + to_string(j)).second || !seen.insert(c + "@box" + to_string(i / 3) + to_string(j / 3)) .second) return false; } return true; } }; 
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Solution { public boolean isValidSudoku(char[][] board) { Set seen = new HashSet<>(); for (int i = 0; i < 9; ++i) for (int j = 0; j < 9; ++j) { if (board[i][j] == '.') continue; final char c = board[i][j]; if (!seen.add(c + "@row" + i) || // !seen.add(c + "@col" + j) || // !seen.add(c + "@box" + i / 3 + j / 3)) return false; } return true; } } 
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Solution: def isValidSudoku(self, board: List[List[str]]) -> bool: seen = set() for i in range(9): for j in range(9): c = board[i][j] if c == '.': continue if c + '@row ' + str(i) in seen or \ c + '@col ' + str(j) in seen or \ c + '@box ' + str(i // 3) + str(j // 3) in seen: return False seen.add(c + '@row ' + str(i)) seen.add(c + '@col ' + str(j)) seen.add(c + '@box ' + str(i // 3) + str(j // 3)) return True