**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.
Constraints:
board.length == 9
board[i].length == 9
board[i][j] is a digit 1-9 or '.'.
ac1: HashSet
set.add() will return boolean, to make your code consise
class Solution {
public boolean isValidSudoku(char[][] board) {
// 3 set: horizontal, vertical, matrix
List<Set<Character>> hori = new ArrayList<Set<Character>>();
List<Set<Character>> verti = new ArrayList<Set<Character>>();
for (int i = 0; i < 9; i++) {
hori.add(new HashSet<Character>());
verti.add(new HashSet<Character>());
}
List<List<Set<Character>>> matr = new ArrayList<List<Set<Character>>>();
for (int i = 0; i < 3; i++) {
List<Set<Character>> tmp = new ArrayList<Set<Character>>();
tmp.add(new HashSet<Character>());
tmp.add(new HashSet<Character>());
tmp.add(new HashSet<Character>());
matr.add(tmp);
}
for (int r = 0; r < 9; r++) {
for (int c = 0; c < 9; c++) {
if (board[r][c] == '.') continue;
if (hori.get(r).contains(board[r][c])){
return false;
} else {
hori.get(r).add(board[r][c]);
}
if (verti.get(c).contains(board[r][c])){
return false;
} else {
verti.get(c).add(board[r][c]);
}
if (matr.get(r/3).get(c/3).contains(board[r][c])) return false;
else matr.get(r/3).get(c/3).add(board[r][c]);
}
}
return true;
}
}
ac2: boolean[][]
faster and concise
class Solution {
public boolean isValidSudoku(char[][] board) {
// 3 boolean matrix
// check current char is used or not
boolean[][] hori = new boolean[9][10];
boolean[][] verti = new boolean[9][10];
boolean[][] cube = new boolean[9][10];
for (int r = 0; r < 9; r++) {
for (int c = 0; c < 9; c++) {
if (board[r][c] == '.') continue;
int val = board[r][c] - '0';
int cubeIdx = (r/3) * 3 + c/3;
if (hori[r][val] || verti[c][val] || cube[cubeIdx][val]) return false;
hori[r][val] = true;
verti[c][val] = true;
cube[cubeIdx][val] = true;
}
}
return true;
}
}