File tree Expand file tree Collapse file tree 3 files changed +195
-0
lines changed
lcci/16.18.Pattern Matching Expand file tree Collapse file tree 3 files changed +195
-0
lines changed Original file line number Diff line number Diff line change @@ -292,6 +292,72 @@ function patternMatching(pattern: string, value: string): boolean {
292
292
}
293
293
```
294
294
295
+ ``` swift
296
+ class Solution {
297
+ private var pattern: String = " "
298
+ private var value: String = " "
299
+
300
+ func patternMatching (_ pattern : String , _ value : String ) -> Bool {
301
+ self .pattern = pattern
302
+ self .value = value
303
+ var cnt = [Int ](repeating : 0 , count : 2 )
304
+ for c in pattern {
305
+ cnt[Int (c.asciiValue ! - Character (" a" ).asciiValue ! )] += 1
306
+ }
307
+ let n = value.count
308
+ if cnt[0 ] == 0 {
309
+ return n % cnt[1 ] == 0 && String (repeating : String (value.prefix (n / cnt[1 ])), count : cnt[1 ]) == value
310
+ }
311
+ if cnt[1 ] == 0 {
312
+ return n % cnt[0 ] == 0 && String (repeating : String (value.prefix (n / cnt[0 ])), count : cnt[0 ]) == value
313
+ }
314
+ for la in 0 ... n {
315
+ if la * cnt[0 ] > n {
316
+ break
317
+ }
318
+ if (n - la * cnt[0 ]) % cnt[1 ] == 0 {
319
+ let lb = (n - la * cnt[0 ]) / cnt[1 ]
320
+ if check (la, lb) {
321
+ return true
322
+ }
323
+ }
324
+ }
325
+ return false
326
+ }
327
+
328
+ private func check (_ la : Int , _ lb : Int ) -> Bool {
329
+ var a: String ? = nil
330
+ var b: String ? = nil
331
+ var index = value.startIndex
332
+
333
+ for c in pattern {
334
+ if c == " a" {
335
+ let end = value.index (index, offsetBy : la)
336
+ if let knownA = a {
337
+ if knownA != value[index..< end] {
338
+ return false
339
+ }
340
+ } else {
341
+ a = String (value[index..< end])
342
+ }
343
+ index = end
344
+ } else {
345
+ let end = value.index (index, offsetBy : lb)
346
+ if let knownB = b {
347
+ if knownB != value[index..< end] {
348
+ return false
349
+ }
350
+ } else {
351
+ b = String (value[index..< end])
352
+ }
353
+ index = end
354
+ }
355
+ }
356
+ return a != b
357
+ }
358
+ }
359
+ ```
360
+
295
361
<!-- tabs:end -->
296
362
297
363
<!-- end -->
Original file line number Diff line number Diff line change @@ -307,6 +307,72 @@ function patternMatching(pattern: string, value: string): boolean {
307
307
}
308
308
```
309
309
310
+ ``` swift
311
+ class Solution {
312
+ private var pattern: String = " "
313
+ private var value: String = " "
314
+
315
+ func patternMatching (_ pattern : String , _ value : String ) -> Bool {
316
+ self .pattern = pattern
317
+ self .value = value
318
+ var cnt = [Int ](repeating : 0 , count : 2 )
319
+ for c in pattern {
320
+ cnt[Int (c.asciiValue ! - Character (" a" ).asciiValue ! )] += 1
321
+ }
322
+ let n = value.count
323
+ if cnt[0 ] == 0 {
324
+ return n % cnt[1 ] == 0 && String (repeating : String (value.prefix (n / cnt[1 ])), count : cnt[1 ]) == value
325
+ }
326
+ if cnt[1 ] == 0 {
327
+ return n % cnt[0 ] == 0 && String (repeating : String (value.prefix (n / cnt[0 ])), count : cnt[0 ]) == value
328
+ }
329
+ for la in 0 ... n {
330
+ if la * cnt[0 ] > n {
331
+ break
332
+ }
333
+ if (n - la * cnt[0 ]) % cnt[1 ] == 0 {
334
+ let lb = (n - la * cnt[0 ]) / cnt[1 ]
335
+ if check (la, lb) {
336
+ return true
337
+ }
338
+ }
339
+ }
340
+ return false
341
+ }
342
+
343
+ private func check (_ la : Int , _ lb : Int ) -> Bool {
344
+ var a: String ? = nil
345
+ var b: String ? = nil
346
+ var index = value.startIndex
347
+
348
+ for c in pattern {
349
+ if c == " a" {
350
+ let end = value.index (index, offsetBy : la)
351
+ if let knownA = a {
352
+ if knownA != value[index..< end] {
353
+ return false
354
+ }
355
+ } else {
356
+ a = String (value[index..< end])
357
+ }
358
+ index = end
359
+ } else {
360
+ let end = value.index (index, offsetBy : lb)
361
+ if let knownB = b {
362
+ if knownB != value[index..< end] {
363
+ return false
364
+ }
365
+ } else {
366
+ b = String (value[index..< end])
367
+ }
368
+ index = end
369
+ }
370
+ }
371
+ return a != b
372
+ }
373
+ }
374
+ ```
375
+
310
376
<!-- tabs:end -->
311
377
312
378
<!-- end -->
Original file line number Diff line number Diff line change
1
+ class Solution {
2
+ private var pattern : String = " "
3
+ private var value : String = " "
4
+
5
+ func patternMatching( _ pattern: String , _ value: String ) -> Bool {
6
+ self . pattern = pattern
7
+ self . value = value
8
+ var cnt = [ Int] ( repeating: 0 , count: 2 )
9
+ for c in pattern {
10
+ cnt [ Int ( c. asciiValue! - Character( " a " ) . asciiValue!) ] += 1
11
+ }
12
+ let n = value. count
13
+ if cnt [ 0 ] == 0 {
14
+ return n % cnt[ 1 ] == 0 && String ( repeating: String ( value. prefix ( n / cnt[ 1 ] ) ) , count: cnt [ 1 ] ) == value
15
+ }
16
+ if cnt [ 1 ] == 0 {
17
+ return n % cnt[ 0 ] == 0 && String ( repeating: String ( value. prefix ( n / cnt[ 0 ] ) ) , count: cnt [ 0 ] ) == value
18
+ }
19
+ for la in 0 ... n {
20
+ if la * cnt[ 0 ] > n {
21
+ break
22
+ }
23
+ if ( n - la * cnt[ 0 ] ) % cnt[ 1 ] == 0 {
24
+ let lb = ( n - la * cnt[ 0 ] ) / cnt[ 1 ]
25
+ if check ( la, lb) {
26
+ return true
27
+ }
28
+ }
29
+ }
30
+ return false
31
+ }
32
+
33
+ private func check( _ la: Int , _ lb: Int ) -> Bool {
34
+ var a : String ? = nil
35
+ var b : String ? = nil
36
+ var index = value. startIndex
37
+
38
+ for c in pattern {
39
+ if c == " a " {
40
+ let end = value. index ( index, offsetBy: la)
41
+ if let knownA = a {
42
+ if knownA != value [ index..< end] {
43
+ return false
44
+ }
45
+ } else {
46
+ a = String ( value [ index..< end] )
47
+ }
48
+ index = end
49
+ } else {
50
+ let end = value. index ( index, offsetBy: lb)
51
+ if let knownB = b {
52
+ if knownB != value [ index..< end] {
53
+ return false
54
+ }
55
+ } else {
56
+ b = String ( value [ index..< end] )
57
+ }
58
+ index = end
59
+ }
60
+ }
61
+ return a != b
62
+ }
63
+ }
You can’t perform that action at this time.
0 commit comments