diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 096. \345\255\227\347\254\246\344\270\262\344\272\244\347\273\207/README.md" "b/lcof2/\345\211\221\346\214\207 Offer II 096. \345\255\227\347\254\246\344\270\262\344\272\244\347\273\207/README.md" index 7303593e9a389..cc29495c4f98f 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 096. \345\255\227\347\254\246\344\270\262\344\272\244\347\273\207/README.md" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 096. \345\255\227\347\254\246\344\270\262\344\272\244\347\273\207/README.md" @@ -290,6 +290,51 @@ public class Solution { } ``` +#### Swift + +```swift +class Solution { + private var memo = [String: Bool]() + private var s1: [Character] = [] + private var s2: [Character] = [] + private var s3: [Character] = [] + private var m = 0 + private var n = 0 + + func isInterleave(_ s1: String, _ s2: String, _ s3: String) -> Bool { + m = s1.count + n = s2.count + if m + n != s3.count { + return false + } + self.s1 = Array(s1) + self.s2 = Array(s2) + self.s3 = Array(s3) + return dfs(0, 0) + } + + private func dfs(_ i: Int, _ j: Int) -> Bool { + if i >= m && j >= n { + return true + } + let key = "\(i),\(j)" + if let cached = memo[key] { + return cached + } + let k = i + j + var ans = false + if i < m && s1[i] == s3[k] && dfs(i + 1, j) { + ans = true + } + if !ans && j < n && s2[j] == s3[k] && dfs(i, j + 1) { + ans = true + } + memo[key] = ans + return ans + } +} +``` + diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 096. \345\255\227\347\254\246\344\270\262\344\272\244\347\273\207/Solution.swift" "b/lcof2/\345\211\221\346\214\207 Offer II 096. \345\255\227\347\254\246\344\270\262\344\272\244\347\273\207/Solution.swift" new file mode 100644 index 0000000000000..d6fca9ca354cb --- /dev/null +++ "b/lcof2/\345\211\221\346\214\207 Offer II 096. \345\255\227\347\254\246\344\270\262\344\272\244\347\273\207/Solution.swift" @@ -0,0 +1,40 @@ +class Solution { + private var memo = [String: Bool]() + private var s1: [Character] = [] + private var s2: [Character] = [] + private var s3: [Character] = [] + private var m = 0 + private var n = 0 + + func isInterleave(_ s1: String, _ s2: String, _ s3: String) -> Bool { + m = s1.count + n = s2.count + if m + n != s3.count { + return false + } + self.s1 = Array(s1) + self.s2 = Array(s2) + self.s3 = Array(s3) + return dfs(0, 0) + } + + private func dfs(_ i: Int, _ j: Int) -> Bool { + if i >= m && j >= n { + return true + } + let key = "\(i),\(j)" + if let cached = memo[key] { + return cached + } + let k = i + j + var ans = false + if i < m && s1[i] == s3[k] && dfs(i + 1, j) { + ans = true + } + if !ans && j < n && s2[j] == s3[k] && dfs(i, j + 1) { + ans = true + } + memo[key] = ans + return ans + } +} \ No newline at end of file