Featured image of post 97. 交错字符串

97. 交错字符串

题目描述

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

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

  • s = s<sub>1</sub> + s<sub>2</sub> + ... + s<sub>n</sub>
  • t = t<sub>1</sub> + t<sub>2</sub> + ... + t<sub>m</sub>
  • |n - m| <= 1
  • 交错s<sub>1</sub> + t<sub>1</sub> + s<sub>2</sub> + t<sub>2</sub> + s<sub>3</sub> + t<sub>3</sub> + ... 或者 t<sub>1</sub> + s<sub>1</sub> + t<sub>2</sub> + s<sub>2</sub> + t<sub>3</sub> + s<sub>3</sub> + ...

注意:a + b 意味着字符串 ab 连接。

示例 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 都由小写英文字母组成

**进阶:**您能否仅使用 O(s2.length) 额外的内存空间来解决它?

解法一:动态规划

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
func isInterleave(s1 string, s2 string, s3 string) bool {
    h, w := len(s1), len(s2)
    if h+w != len(s3) {
        return false
    }
    dp := make([][]bool, h+1)
    for i := 0; i <= h; i++ {
        dp[i] = make([]bool, w+1)
    }
    dp[0][0] = true
    for i := 0; i <= h; i++ {
        for j := 0; j <= w; j++ {
            if i > 0 && s1[i-1] == s3[i+j-1] {
                dp[i][j] = dp[i-1][j]
            }
            if j > 0 && s2[j-1] == s3[i+j-1] {
                dp[i][j] = dp[i][j] || dp[i][j-1]
            }
        }
    }
    return dp[h][w]
}
Licensed under CC BY-NC-SA 4.0
最后更新于 2023/07/22 16:48:17
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计