Skip to content

Commit b26fc05

Browse files
authored
feat: add swift implementation to lcci problem: No.16.18 (#2761)
1 parent 128ef00 commit b26fc05

File tree

3 files changed

+195
-0
lines changed

3 files changed

+195
-0
lines changed

lcci/16.18.Pattern Matching/README.md

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,72 @@ function patternMatching(pattern: string, value: string): boolean {
292292
}
293293
```
294294

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+
295361
<!-- tabs:end -->
296362

297363
<!-- end -->

lcci/16.18.Pattern Matching/README_EN.md

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,72 @@ function patternMatching(pattern: string, value: string): boolean {
307307
}
308308
```
309309

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+
310376
<!-- tabs:end -->
311377

312378
<!-- end -->
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
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+
}

0 commit comments

Comments
 (0)