
模拟即可。
第一种情况:逐行检查
首先,我们逐行遍历这个9X9的二维列表,每行建立一个storage的列表,用于存储每行出现的数字字符。如果字符为".",直接continue。如果为其他字符,则放入storage中。如果遍历到的字符已经出现在了storage中,那么直接return False。(因为证明了数字字符重复出现了!!!)
第二种情况:逐列检查
逐列遍历,思路同逐行遍历!
第三种情况:检查九宫格
第一层循环控制,每个九宫格对应的board行索引。第二次循环控制,每个九宫格对应的board列索引。
第三层循环控制具体到每个九宫格里面的行遍历,第四层循环控制具体到每个九宫格里面的列遍历。
第三四层循环控制一个3X3格子的检查,思路同逐行遍历和逐列遍历。借助storage列表。
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
# 逐行检查
for i in range(9):
# 存储每行出现的数字字符
storage = []
for j in range(9):
if board[i][j] == '.':
continue
if board[i][j] in storage:
return False
else:
storage.append(board[i][j])
# 逐列检查
for i in range(9):
# 存储每列出现的数字字符
storage = []
for j in range(9):
if board[j][i] == '.':
continue
if board[j][i] in storage:
return False
else:
storage.append(board[j][i])
# 检查九宫格
# 每个九宫格的开始索引
for i in range(0, 9, 3):
for j in range(0, 9, 3):
storage = []
# 遍历3X3格子中字符
for x in range(0, 3):
for y in range(0, 3):
if board[i+x][j+y] == ".":
continue
if board[i+x][j+y] in storage:
return False
else:
storage.append(board[i+x][j+y])
# 全部检查通过
return True
