题目如下:
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 '.'
A partially filled sudoku which is valid.
Note:
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.
分析如下:
我的代码:
class Solution {
private:
bool detectRepetition(vector<char> &part) {
std::set<char> part_set;
for (int i = 0; i < part.size(); ++i) {
if (part[i] == '.')
continue;
if (part[i] - '0' > 9 || part[i] - '0' < 0 )
return false;
if (part_set.find(part[i]) == part_set.end()) //一开始错写为了part_set::end();
part_set.insert(part[i]);
else
return false;
}
return true;
}
public:
bool isValidSudoku(vector<vector<char> > &board) {
int rows = board.size();
if (rows == 0)
return true;
int cols = board[0].size();
//每次处理一行
for (int i = 0; i < rows; ++i) {
if ( !detectRepetition(board[i]))
return false;
}
vector<char> tmp_vec;
//每次处理一列
for (int j = 0; j < cols; ++j) {
for (int i = 0; i < rows; ++i) {
tmp_vec.push_back(board[i][j]);
}
if ( !detectRepetition(tmp_vec))
return false;
tmp_vec.clear();
}
//每次处理一个3*3正方形
for (int i = 0; i < rows; i += 3) { //NOTE: 注意i,j的变化逻辑,i, j步长为3
for (int j = 0; j < cols; j += 3) {
tmp_vec.insert(tmp_vec.end(), board[i].begin() + j, board[i].begin() + j+3);//以下每次处理3行
tmp_vec.insert(tmp_vec.end(), board[i+1].begin() + j, board[i+1].begin() + j+3);
tmp_vec.insert(tmp_vec.end(), board[i+2].begin() + j, board[i+2].begin() + j+3);
if ( !detectRepetition(tmp_vec))
return false;
tmp_vec.clear();
}
}
return true;
}
};