meta data for this page
  •  

Valid Sudoku

Leetcode


Determine if a 9 x 9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:

  1. Each row must contain the digits 1-9 without repetition.
  2. Each column must contain the digits 1-9 without repetition.
  3. Each of the nine 3 x 3 sub-boxes of the grid must contain the digits 1-9 without repetition.

Note:

  • A Sudoku board (partially filled) could be valid but is not necessarily solvable.
  • Only the filled cells need to be validated according to the mentioned rules.

Example 1:

Input: board = 
[["5","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]]
Output: true

Example 2:

Input: board = 
[["8","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]]
Output: false
Explanation: Same as Example 1, except with the 5 in the top left corner being modified to 8. Since there are two 8's in the top left 3x3 sub-box, it is invalid.

Solution 1

Solution 1

public boolean isValidSudoku(char[][] board) {
  for (int r = 0; r < board.length; r = r + 3) {
    for (int c = 0; c < board.length; c = c + 3) {
      if (!isValidDigits(board, r, r + 3, c, c + 3)) {
        return false;
      }
    }
  }
 
  for (int r = 0; r < board.length; r++) {
    if (!isValidDigits(board, r, r + 1, 0, 9)) {
      return false;
    }
  }
 
  for (int c = 0; c < board.length; c++) {
    if (!isValidDigits(board, 0, 9, c, c + 1)) {
      return false;
    }
  }
 
  return true;
}
 
private boolean isValidDigits(char[][] board, int startRow, int endRow, int startCol, int endCol) {
  Set<Character> filled = new HashSet<>();
  for (int r = startRow; r < endRow; r++) {
    for (int c = startCol; c < endCol; c++) {
      if (board[r][c] == '.') continue;
      if (filled.contains(board[r][c])) {
        return false;
      }
      filled.add(board[r][c]);
    }
  }
  return true;
}