Problem
Determine if a 9 x 9
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 nine
3 x 3
sub-boxes of the grid must contain the digits1-9
without repetition.
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.
Example 1:
Input: board = [[“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: 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 3×3 sub-box, it is invalid.
Constraints:
board.length == 9
board[i].length == 9
board[i][j]
is a digit1-9
or'.'
.
Solution
First attempt : (Can be optimized further)
/**
* @param {character[][]} board
* @return {boolean}
*/
var isValidSudoku = function(board) {
// iterate through each row
for(let i = 0; i < board.length;i++){
let testSet = new Set(["1","2","3","4","5","6","7","8","9"]);
for(let y = 0; y < board[i].length; y ++){
if(board[i][y] == "."){
continue;
}
if(!testSet.delete(board[i][y])){
// console.log(board[i][y], " not found in ", testSet, testSet.delete(board[i][y]))
return false;
}
}
}
// iterate through each column
for(let i = 0; i < board[0].length; i++){
let testSet = new Set(["1","2","3","4","5","6","7","8","9"]);
for(let y = 0; y < board.length; y++){
if(board[y][i] == "."){
continue;
}
if(!testSet.delete(board[y][i])){
return false;
}
}
}
// iterate through each 3*3 block
for(let block = 0; block < 9; block++){
let testSet = new Set(["1","2","3","4","5","6","7","8","9"]);
for(let i = 0; i < 3; i++){
for(let j = 0; j < 3; j++){
let rowIndex = 3 * Math.floor(block / 3) + i;
let colIndex = 3 * (block % 3) + j;
if(board[rowIndex][colIndex] == "."){
continue;
}
if(!testSet.delete(board[rowIndex][colIndex])){
return false;
}
}
}
}
//console.log(board)
return true;
};
A freelance web developer with a decade of experience in creating high-quality, scalable web solutions. His expertise spans PHP, WordPress, Node.js, MySQL, MongoDB, and e-commerce development, ensuring a versatile approach to each project. Aadi’s commitment to client satisfaction is evident in his track record of over 200 successful projects, marked by innovation, efficiency, and a customer-centric philosophy.
As a professional who values collaboration and open communication, Aadi has built a reputation for delivering projects that exceed expectations while adhering to time and budget constraints. His proactive and problem-solving mindset makes him an ideal partner for anyone looking to navigate the digital landscape with a reliable and skilled developer.