Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.The Sudoku board could be partially filled, where empty cells are filled with the character '.'.
![](http://upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Sudoku-by-L2G-20050714.svg/250px-Sudoku-by-L2G-20050714.svg.png)
网上看到的最优做法:
1 public class Solution { 2 public boolean isValidSudoku(char[][] board) { 3 for (int i=0; i<9; i++) { 4 if (!isParticallyValid(board,i,0,i,8)) return false; 5 if (!isParticallyValid(board,0,i,8,i)) return false; 6 } 7 for (int i=0;i<3;i++){ 8 for(int j=0;j<3;j++){ 9 if (!isParticallyValid(board,i*3,j*3,i*3+2,j*3+2)) return false;10 }11 }12 return true;13 }14 private boolean isParticallyValid(char[][] board, int x1, int y1,int x2,int y2){15 Set singleSet = new HashSet();16 for (int i= x1; i<=x2; i++){17 for (int j=y1;j<=y2; j++){18 if (board[i][j]!='.') if(!singleSet.add(board[i][j])) return false;19 }20 }21 return true;22 }23 }
然后在解Sudoku Solver的时候,遇到了一个很简单的解法(但是这里不适用):
1 public class Solution { 2 public boolean isValidSudoku(char[][] board) { 3 if (board == null || board.length != 9 || board[0].length != 9) return false; 4 for (int i = 0; i < 9; i++) { 5 for (int j = 0; j < 9; j++) { 6 if (board[i][j] == '.') continue; 7 if (!isvalid(board, i, j)) return false; 8 } 9 }10 return true;11 }12 13 public boolean isvalid(char[][] board, int i, int j) {14 for (int a = 0; a < 9; a++) {15 if (a != i && board[a][j] == board[i][j]) return false;16 }17 18 for (int b = 0; b < 9; b++) {19 if (b != j && board[i][b] == board[i][j]) return false; 20 }21 22 for (int c = i/3*3; c < i/3*3 + 3; c++) {23 for (int d = j/3*3; d < j/3*3 + 3; d++) {24 if ((c != i || d != j) && board[c][d] == board[i][j]) return false;25 }26 }27 28 return true;29 }30 }