6
6
*/
7
7
8
8
class ValidSudoku {
9
- let size = 9
10
-
11
- func isValidSudoku( board: [ [ Character ] ] ) -> Bool {
12
- return _isRowValid ( board) && _isColValid ( board) && _isSquareValid ( board)
9
+ func isValidSudoku( _ board: [ [ Character ] ] ) -> Bool {
10
+ return areRowsValid ( board) && areColsValid ( board) && areSubsquaresValid ( board)
13
11
}
14
12
15
- private func _isRowValid ( board: [ [ Character ] ] ) -> Bool {
16
- var visited = Array ( count : size , repeatedValue : false )
13
+ private func areRowsValid ( _ board: [ [ Character ] ] ) -> Bool {
14
+ var existingDigits = Set < Character > ( )
17
15
18
- for i in 0 ..< size {
19
- visited = Array ( count: size, repeatedValue: false )
20
- for j in 0 ..< size {
21
- if !_isValidChar( board [ i] [ j] , & visited) {
16
+ for i in 0 ..< board. count {
17
+ existingDigits. removeAll ( )
18
+
19
+ for j in 0 ..< board [ 0 ] . count {
20
+ if !isDigitValid( board [ i] [ j] , & existingDigits) {
22
21
return false
23
22
}
24
23
}
@@ -27,13 +26,14 @@ class ValidSudoku {
27
26
return true
28
27
}
29
28
30
- private func _isColValid( board: [ [ Character ] ] ) -> Bool {
31
- var visited = Array ( count: size, repeatedValue: false )
32
-
33
- for i in 0 ..< size {
34
- visited = Array ( count: size, repeatedValue: false )
35
- for j in 0 ..< size {
36
- if !_isValidChar( board [ j] [ i] , & visited) {
29
+ private func areColsValid( _ board: [ [ Character ] ] ) -> Bool {
30
+ var existingDigits = Set < Character > ( )
31
+
32
+ for i in 0 ..< board [ 0 ] . count {
33
+ existingDigits. removeAll ( )
34
+
35
+ for j in 0 ..< board. count {
36
+ if !isDigitValid( board [ j] [ i] , & existingDigits) {
37
37
return false
38
38
}
39
39
}
@@ -42,15 +42,16 @@ class ValidSudoku {
42
42
return true
43
43
}
44
44
45
- private func _isSquareValid ( board: [ [ Character ] ] ) -> Bool {
46
- var visited = Array ( count : size , repeatedValue : false )
45
+ private func areSubsquaresValid ( _ board: [ [ Character ] ] ) -> Bool {
46
+ var existingDigits = Set < Character > ( )
47
47
48
- for i in 0 . stride ( to: size, by: 3 ) {
49
- for j in 0 . stride ( to: size, by: 3 ) {
50
- visited = Array ( count: size, repeatedValue: false )
48
+ for i in stride ( from: 0 , to: board. count, by: 3 ) {
49
+ for j in stride ( from: 0 , to: board [ 0 ] . count, by: 3 ) {
50
+ existingDigits. removeAll ( )
51
+
51
52
for m in i..< i + 3 {
52
53
for n in j..< j + 3 {
53
- if !_isValidChar ( board [ m] [ n] , & visited ) {
54
+ if !isDigitValid ( board [ m] [ n] , & existingDigits ) {
54
55
return false
55
56
}
56
57
}
@@ -61,21 +62,16 @@ class ValidSudoku {
61
62
return true
62
63
}
63
64
64
- private func _isValidChar( char: Character , inout _ visited: [ Bool ] ) -> Bool {
65
- let current = String ( char)
66
-
67
- if current != " . " {
68
- if let num = Int ( current) {
69
- if num < 1 || num > 9 || visited [ num - 1 ] {
70
- return false
71
- } else {
72
- visited [ num - 1 ] = true
73
- }
74
- } else {
75
- return false
76
- }
77
- }
65
+ private func isDigitValid( _ digit: Character , _ set: inout Set < Character > ) -> Bool {
66
+ if digit == " . " {
67
+ return true
68
+ }
78
69
79
- return true
70
+ if set. contains ( digit) {
71
+ return false
72
+ } else {
73
+ set. insert ( digit)
74
+ return true
75
+ }
80
76
}
81
77
}
0 commit comments