class Solution {
public boolean isValidSudoku(char[][] board) {
if (board == null || board.length == 0) return false;
int n = board.length, m = board[0].length;
//row
for (int i = 0; i < n; i++){
Set<Integer> hash = new HashSet<>();
for (int j = 0; j < m; j++){
if (board[i][j] == '.') continue;
int num = board[i][j] - '0';
if (hash.contains(num)) return false;
hash.add(num);
}
}
//col
for (int j = 0; j < m; j++){
Set<Integer> hash = new HashSet<>();
for (int i = 0; i < n; i++){
if (board[i][j] == '.') continue;
int num = board[i][j] - '0';
if (hash.contains(num)) return false;
hash.add(num);
}
}
//cell
for (int i = 0; i < 9; i+=3){
for (int j = 0; j < 9; j+=3){
Set<Integer> hash = new HashSet<>();
for (int k = 0; k < 9; k++){
if (board[i + k / 3][j + k % 3] == '.') continue;
int num = board[i + k / 3][j + k % 3] - '0';
if (hash.contains(num)) return false;
hash.add(num);
}
}
}
return true;
}
}