Skip to content

Commit ce1d4f8

Browse files
authored
feat: add swift implementation to lcof2 problem: No.096 (doocs#3482)
1 parent 7bad7f3 commit ce1d4f8

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed

lcof2/剑指 Offer II 096. 字符串交织/README.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,51 @@ public class Solution {
290290
}
291291
```
292292

293+
#### Swift
294+
295+
```swift
296+
class Solution {
297+
private var memo = [String: Bool]()
298+
private var s1: [Character] = []
299+
private var s2: [Character] = []
300+
private var s3: [Character] = []
301+
private var m = 0
302+
private var n = 0
303+
304+
func isInterleave(_ s1: String, _ s2: String, _ s3: String) -> Bool {
305+
m = s1.count
306+
n = s2.count
307+
if m + n != s3.count {
308+
return false
309+
}
310+
self.s1 = Array(s1)
311+
self.s2 = Array(s2)
312+
self.s3 = Array(s3)
313+
return dfs(0, 0)
314+
}
315+
316+
private func dfs(_ i: Int, _ j: Int) -> Bool {
317+
if i >= m && j >= n {
318+
return true
319+
}
320+
let key = "\(i),\(j)"
321+
if let cached = memo[key] {
322+
return cached
323+
}
324+
let k = i + j
325+
var ans = false
326+
if i < m && s1[i] == s3[k] && dfs(i + 1, j) {
327+
ans = true
328+
}
329+
if !ans && j < n && s2[j] == s3[k] && dfs(i, j + 1) {
330+
ans = true
331+
}
332+
memo[key] = ans
333+
return ans
334+
}
335+
}
336+
```
337+
293338
<!-- tabs:end -->
294339

295340
<!-- solution:end -->
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
class Solution {
2+
private var memo = [String: Bool]()
3+
private var s1: [Character] = []
4+
private var s2: [Character] = []
5+
private var s3: [Character] = []
6+
private var m = 0
7+
private var n = 0
8+
9+
func isInterleave(_ s1: String, _ s2: String, _ s3: String) -> Bool {
10+
m = s1.count
11+
n = s2.count
12+
if m + n != s3.count {
13+
return false
14+
}
15+
self.s1 = Array(s1)
16+
self.s2 = Array(s2)
17+
self.s3 = Array(s3)
18+
return dfs(0, 0)
19+
}
20+
21+
private func dfs(_ i: Int, _ j: Int) -> Bool {
22+
if i >= m && j >= n {
23+
return true
24+
}
25+
let key = "\(i),\(j)"
26+
if let cached = memo[key] {
27+
return cached
28+
}
29+
let k = i + j
30+
var ans = false
31+
if i < m && s1[i] == s3[k] && dfs(i + 1, j) {
32+
ans = true
33+
}
34+
if !ans && j < n && s2[j] == s3[k] && dfs(i, j + 1) {
35+
ans = true
36+
}
37+
memo[key] = ans
38+
return ans
39+
}
40+
}

0 commit comments

Comments
 (0)