LeetCode - #97 交错字符串

92 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情

前言

本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。

我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。

LeetCode 算法到目前我们已经更新到 96 期,我们会保持更新时间和进度(周一、周三、周五早上 9:00 发布),每期的内容不多,我们希望大家可以在上班路上阅读,长久积累会有很大提升。

不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。

难度水平:中等

1. 描述

给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。

两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:

s = s1 + s2 + ... + sn t = t1 + t2 + ... + tm |n - m| <= 1 交错 是 s1 + t1 + s2 + t2 + s3 + t3 + ... 或者 t1 + s1 + t2 + s2 + t3 + s3 + ... 注意:a + b 意味着字符串 a 和 b 连接。

2. 示例

示例 1

输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
输出:true

示例 2

输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
输出:false

示例 3

输入:s1 = "", s2 = "", s3 = ""
输出:true

提示:

  • 0 <= s1.length, s2.length <= 100
  • 0 <= s3.length <= 200`
  • s1s2、和 s3 都由小写英文字母组成

3. 答案

class Solution {
   func isInterleave(_ s1: String, _ s2: String, _ s3: String) -> Bool {
       var cache = [[Int]](repeating: [Int](repeating: -1, count: s2.count), count: s1.count)
       return is_Interleave(s1, 0, s2, 0, s3, 0, &cache)
   }

   fileprivate func is_Interleave(_ s1: String, _ i: Int, _ s2: String, _ j: Int, _ s3: String, _ k: Int, _ cache: inout [[Int]]) -> Bool {
       if i == s1.count {
           return s2[j..<s2.count] == s3[k..<s3.count]
       }
       if j == s2.count {
           return s1[i..<s1.count] == s3[k..<s3.count]
       }
       if cache[i][j] >= 0 {
           return cache[i][j] == 1 ? true : false
       }

       var ans = false

       if (s3[k] == s1[i] && is_Interleave(s1, i + 1, s2, j, s3, k + 1, &cache)) ||
           (s3[k] == s2[j] && is_Interleave(s1, i, s2, j + 1, s3, k + 1, &cache)) {
           ans = true
       }
       cache[i][j] = ans ? 1 : 0

       return ans
   }
}

extension String {
   subscript (i: Int) -> Character {
       return self[index(startIndex, offsetBy: i)]
   }

   subscript(_ range: CountableRange<Int>) -> String {
       let idx1 = index(startIndex, offsetBy: max(0, range.lowerBound))
       let idx2 = index(startIndex, offsetBy: min(self.count, range.upperBound))
       return String(self[idx1..<idx2])
   }
}

点击前往 LeetCode 练习

关于我们

我们是由 Swift 爱好者共同维护,我们会分享以 Swift 实战、SwiftUI、Swift 基础为核心的技术内容,也整理收集优秀的学习资料。