**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
classSolution {publicbooleanisValidSudoku(char[][] board) {// 3 set: horizontal, vertical, matrixList<Set<Character>> hori =newArrayList<Set<Character>>();List<Set<Character>> verti =newArrayList<Set<Character>>();for (int i =0; i <9; i++) {hori.add(newHashSet<Character>());verti.add(newHashSet<Character>()); }List<List<Set<Character>>> matr =newArrayList<List<Set<Character>>>();for (int i =0; i <3; i++) {List<Set<Character>> tmp =newArrayList<Set<Character>>();tmp.add(newHashSet<Character>());tmp.add(newHashSet<Character>());tmp.add(newHashSet<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])){returnfalse; } else {hori.get(r).add(board[r][c]); }if (verti.get(c).contains(board[r][c])){returnfalse; } else {verti.get(c).add(board[r][c]); }if (matr.get(r/3).get(c/3).contains(board[r][c])) returnfalse;elsematr.get(r/3).get(c/3).add(board[r][c]); } }returntrue; }}
ac2: boolean[][]
faster and concise
classSolution {publicbooleanisValidSudoku(char[][] board) {// 3 boolean matrix// check current char is used or notboolean[][] hori =newboolean[9][10];boolean[][] verti =newboolean[9][10];boolean[][] cube =newboolean[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]) returnfalse; hori[r][val] =true; verti[c][val] =true; cube[cubeIdx][val] =true; } }returntrue; }}