# 36-Valid Sudoku
###### tags: `Medium`、`Hash_table`
## Question
https://leetcode.com/problems/valid-sudoku/
## Key
Hash table
## Solution
- 我的寫法
```c++=
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board)
{
// Row examination
for (int row = 0 ; row < 9 ; row ++)
{
int [] map = new int[128];
for (int ind = 0; ind < 9 ; ind++ )
{
char c = board[row][ind];
if (c != ".")
{
if (map[c] != 0)
{
return false;
}
else
{
map[c]++;
}
}
}
}
// Column examination
for (int col = 0 ; col < 9 ; col ++)
{
int[] map = new int[128];
for (int ind = 0; ind < 9; ind ++ )
{
char c = board[col][ind];
if (c != ".")
{
if (map[c] != 0)
{
return false;
}
else
{
map[c]++;
}
}
}
}
// matrix examination
for(int m = 0; m < 9; m++)
{
int[] map = new int[128];
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
c = board[(m/3)*3+i][(m%3)*3+j];
//每隔三個矩陣使用到的行才會一樣 每三個矩陣使用到的列才會一樣
if (c != ".")
{
if (map[c] != 0)
{
return false;
}
else
{
map[c]++;
}
}
}
}
}
};
}
```
- 大神寫法
```c++=
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
unordered_map<char,int[3]>num[9]; // used unordered_map's array of 9 size which denote row/column/box
for(int i=0;i<board.size();i++)
{
for(int j=0;j<board[i].size();j++)
{
char c=board[i][j];
if(c!='.' &&(num[i][c][0]++>0||num[j][c][1]++>0||num[i/3*3+j/3][c][2]++>0))
{
return false;
}
}
}
return true;
}
};
```
### Python solution
- 大神寫法:
```python=
class Solution(object):
def isValidSudoku(self, board):
"""
:type board: List[List[str]]
:rtype: bool
"""
return self.isRowValid(board) and self.isColValid(board) and self.isSquareValid(board)
def isRowValid(self, board):
for row in board:
if not self.isValid(row):
return False
return True
def isColValid(self, board):
for col in zip(*board):
if not self.isValid(col):
return False
return True
def isSquareValid(self, board):
for i in (0, 3, 6):
for j in (0, 3, 6):
square = [board[x][y] for x in range(i, i+3) for y in range(j, j+3)]
if not self.isValid(square):
return False
return True
def isValid(self, unit):
unit = [i for i in unit if i != '.']
return len(set(unit)) == len(unit)
```