CMD Guide
HomeDSACompany Practice

medium Valid Sudoku

Problem Statement

Determine if a 9x9 Sudoku board is valid. A valid Sudoku board will hold the following conditions:

  1. Each row must contain the digits 1-9 without repetition.
  2. Each column must contain the digits 1-9 without repetition.
  3. The 9 3x3 sub-boxes of the grid must also contain the digits 1-9 without repetition.

Note:

  1. The Sudoku board could be partially filled, where empty cells are filled with the character '.'.
  2. You need to validate only filled cells.

Example 1:

Example 2:

Example 3:

Constraints:

Try it yourself

Try solving this question here:

🎯 STRICT STANDOUT — Valid Sudoku — problem

0. Pattern family

Family: Constraint sets rows/cols/boxes

1. Why / judgment (K3)

Validate partial board: each row/col/box no duplicate digits; '.' empty. Not a solver (backtracking). Box index = (r/3)*3 + c/3.

2. Worked complexity / derivation (K11)

9×9 fixed → O(1). General n²×n² → O(n²). Space O(1) bitmasks or O(1) sets size 9.

3. Pattern + recognition + when-NOT (K12)

Name: SUDOKU VALIDATION SETS

Recognition: check duplicates in rows, cols, 3×3 — not fill.

When-NOT: Solve Sudoku → BT. Generate full boards.

4. Edge hand-run (K13)

Valid partial true. Dup in box only false. All '.' true.

5. Interviewer follow-ups & drills

Q1. Box id formula?
Model answer: (r//3)*3 + c//3.

Q2. Bitmask?
Model answer: row[r] |= 1<<d; if already set invalid.

Q3. Why not BT?
Model answer: Problem is validation only; solving is harder sibling.

✅ Solution Valid Sudoku

Problem Statement

Determine if a 9x9 Sudoku board is valid. A valid Sudoku board will hold the following conditions:

  1. Each row must contain the digits 1-9 without repetition.
  2. Each column must contain the digits 1-9 without repetition.
  3. The 9 3x3 sub-boxes of the grid must also contain the digits 1-9 without repetition.

Note:

  1. The Sudoku board could be partially filled, where empty cells are filled with the character '.'.
  2. You need to validate only filled cells.

Example 1:

  • Input:
    [["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"]]
    
  • Expected Output: true
  • Justification: This Sudoku board is valid as it adheres to the rules of no repetition in each row, each column, and each 3x3 sub-box.

Example 2:

  • Input:
    [["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"]]
    
  • Expected Output: false
  • Justification: The first and fourth rows both contain the number '8', violating the Sudoku rules.

Example 3:

  • Input:
    [[".",".","4",".",".",".","6","3","."]
    ,[".",".",".",".",".",".",".",".","."]
    ,["5",".",".",".",".",".",".","9","."]
    ,[".",".",".","5","6",".",".",".","."]
    ,["4",".","3",".",".",".",".",".","1"]
    ,[".",".",".","7",".",".",".",".","."]
    ,[".",".",".","5",".",".",".",".","."]
    ,[".",".",".",".",".",".",".",".","."]
    ,[".",".",".",".",".",".",".",".","."]]
    
  • Expected Output: false
  • Justification: The fourth column contains the number '5' two times, violating the Sudoku rules.

Constraints:

  • board.length == 9
  • board[i].length == 9
  • board[i][j] is a digit 1-9 or '.'.

Solution

  • Initialization:
    • Create three hash sets for rows, columns, and boxes to keep track of the seen numbers.
  • Iteration:
    • Iterate through each cell in the 9x9 board.
      • If the cell is not empty:
        • Formulate keys for the row, column, and box that include the current number and its position.
        • Check the corresponding sets for these keys.
          • If any key already exists in the sets, return false.
          • Otherwise, add the keys to the respective sets.
  • Final Check:
    • If the iteration completes without finding any repetition, return true.

This approach works because it checks all the necessary conditions for a valid Sudoku by keeping track of the numbers in each row, column, and box using hash sets. The use of hash sets allows for efficient lookups to ensure no numbers are repeated in any row, column, or box.

Algorithm Walkthrough

Consider Example 2 from above:

  • Initialize three empty hash sets for rows, columns, and boxes.
  • Start iterating through each cell in the board.
    • For the first cell, which contains '8':
      • Formulate keys: row0(8), col0(8), and box0(8).
      • Since these keys are not in the sets, add them.
    • Continue this for other cells.
    • Upon reaching the first cell of the fourth row, which also contains '8':
      • Formulate keys: row3(8), col0(8), and box1(8).
      • The key col0(8) already exists in the column set, so return false.

Code

java
import java.util.HashSet;

public class Solution {

  public boolean isValidSudoku(char[][] board) {
    // Initialize sets to keep track of the numbers in each row, column, and box.
    HashSet<String> rows = new HashSet<>();
    HashSet<String> columns = new HashSet<>();
    HashSet<String> boxes = new HashSet<>();

    // Iterate through each cell in the 9x9 board.
    for (int i = 0; i < 9; i++) {
      for (int j = 0; j < 9; j++) {
        char num = board[i][j];
        if (num != '.') {
          // Formulate keys for the row, column, and box.
          String rowKey = "row" + i + "(" + num + ")";
          String colKey = "col" + j + "(" + num + ")";
          String boxKey = "box" + ((i / 3) * 3 + j / 3) + "(" + num + ")";
          // Check the corresponding sets for these keys.
          if (!rows.add(rowKey) || !columns.add(colKey) || !boxes.add(boxKey)) {
            return false;
          }
        }
      }
    }
    return true;
  }

  public static void main(String[] args) {
    Solution sol = new Solution();
    // Test the algorithm with three example inputs.
    char[][] board1 = {
      { '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' },
    };
    System.out.println(sol.isValidSudoku(board1)); // Output: true
  }
}

Complexity Analysis

  • Time Complexity: O(1) or O(81), as we only iterate through the 9x9 board once.
  • Space Complexity: O(1) or O(81), as the maximum size of our sets is 81.

🎯 STRICT STANDOUT — Solution Valid Sudoku

0. Pattern family

Family: Three constraint bitsets / hash sets

1. Why / judgment (K3)

One pass: for each filled cell test/set row, col, box masks. Empty skip. Standout names box index formula.

2. Worked complexity / derivation (K11)

O(1) for 9×9. General O(N) cells.

3. Pattern + recognition + when-NOT (K12)

Name: PARTIAL SUDOKU VALIDATE

Recognition: no dups in row/col/box.

When-NOT: Full solver BT with MRV. Exact cover dancing links — overkill.

4. Edge hand-run (K13)

Dup in only one unit → false. Valid incomplete → true.

5. Interviewer follow-ups & drills

Q1. Three arrays of sets?
Model answer: row[9], col[9], box[9].

Q2. Char digit?
Model answer: d = board[r][c]-'1' for 0..8 bits.

Q3. Why not solve?
Model answer: Validation ≠ unique completion.

🧩 Pattern · Backtracking

Recognize it: Enumerate all subsets / permutations / combinations under constraints → recurse, choose, un-choose.

▶ Visualize this problem (step it, predict each fork)
⛶ Open this problem debugger in explore mode
🤖 Don't fully get this? Learn it with Claude

Stuck on Valid Sudoku? Open Claude, copy a block below, and it'll teach you this exact concept — visually and interactively.

🪜 Hint ladder (no spoilers)

Progressively stronger hints — you still solve it.

I'm working on the problem **Valid Sudoku** (DSA). Give me a HINT LADDER: start with the tiniest nudge, then wait. Only reveal the next, stronger hint when I ask. Do NOT show the full solution unless I type 'show solution'. Keep me doing the thinking. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🎨 Explain the approach visually

See the technique, not just code.

Explain the optimal approach to **Valid Sudoku** with a VISUAL walkthrough: trace it on a small concrete example using ASCII art / a step-by-step diagram, narrate what changes each step, then give time & space complexity with a one-line derivation. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🔍 Review my solution

Catch bugs, edge cases, sub-optimality.

I'll paste my solution to **Valid Sudoku**. Review it for correctness, missed edge cases, and time/space complexity, then coach me toward the optimal — don't just rewrite it. Ask me to paste my code now. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🔁 Drill the pattern

Lock in recognition with look-alikes.

Give me 2 problems that use the SAME underlying pattern as **Valid Sudoku**. For each, let me attempt first, then review my answer and name the trigger signal that reveals the pattern. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.

📝 My notes