summary:
step by step
package myapp.kit.leetcode.top145;
import java.util.HashSet;
import java.util.Set;
/**
*
* 36
* medium
* https://leetcode.com/problems/valid-sudoku/
*
* Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:
*
* Each row must contain the digits 1-9 without repetition.
* Each column must contain the digits 1-9 without repetition.
* Each of the 9 3x3 sub-boxes of the grid must contain the digits 1-9 without repetition.
*
* A partially filled sudoku which is valid.
*
* The Sudoku board could be partially filled, where empty cells are filled with the character '.'.
*
* 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"]
* ]
* Output: true
* 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"]
* ]
* Output: false
*
* [
* [".",".",".",".",".",".","5",".","."],
* [".",".",".",".",".",".",".",".","."],
* [".",".",".",".",".",".",".",".","."],
* ["9","3",".",".","2",".","4",".","."],
* [".",".","7",".",".",".","3",".","."],
* [".",".",".",".",".",".",".",".","."],
* [".",".",".","3","4",".",".",".","."],
* [".",".",".",".",".","3",".",".","."],
* [".",".",".",".",".","5","2",".","."]
* ]
*
*
* 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.
* 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.
* The given board contain only digits 1-9 and the character '.'.
* The given board size is always 9x9.
*
* @author Dingsheng Huang
* @version 1.0.0 2020/6/7 19:09
*/
public class ValidSudoku {
public boolean isValidSudoku(char[][] board) {
// validate x
for (int i = 0; i < board.length; i++) {
Set<Character> set = new HashSet<>();
for (int j = 0; j < board[i].length; j++) {
if (board[i][j] == '.') {
continue;
}
if (set.contains(board[i][j])) {
return false;
}
set.add(board[i][j]);
}
}
// validate y
for (int i = 0; i < board.length; i++) {
Set<Character> set = new HashSet<>();
for (int j = 0; j < board[i].length; j++) {
if (board[j][i] == '.') {
continue;
}
if (set.contains(board[j][i])) {
return false;
}
set.add(board[j][i]);
}
}
// validate 3 * 3
for (int i = 0; i <= board.length - 3; i += 3) {
for (int j = 0; j <= board[i].length - 3; j += 3) {
if (!validate(board, i, j)) {
return false;
}
}
}
return true;
}
private boolean validate(char[][] board, int x, int y) {
Set<Character> set = new HashSet<>();
for (int i = x; i < x + 3; i++) {
for (int j = y; j < y + 3; j++) {
if (board[i][j] == '.') {
continue;
}
if (set.contains(board[i][j])) {
return false;
}
set.add(board[i][j]);
}
}
return true;
}
}