IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode97-交错字符串 -> 正文阅读

[数据结构与算法]LeetCode97-交错字符串

1. 题目描述

  • 来源:力扣(LeetCode)
  • 链接:https://leetcode.cn/problems/interleaving-string
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

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

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

  • s = s 1 + s 2 + . . . + s n s = s_1 + s_2 + ... + s_n s=s1?+s2?+...+sn?
  • t = t 1 + t 2 + . . . + t m t = t_1 + t_2 + ... + t_m t=t1?+t2?+...+tm?
  • $ |n - m| <= 1 $
  • 交错 s 1 + t 1 + s 2 + t 2 + s 3 + t 3 + . . . s_1 + t_1 + s_2 + t_2 + s_3 + t_3 + ... s1?+t1?+s2?+t2?+s3?+t3?+... 或者 t 1 + s 1 + t 2 + s 2 + t 3 + s 3 + . . . t_1 + s_1 + t_2 + s_2 + t_3 + s_3 + ... t1?+s1?+t2?+s2?+t3?+s3?+...

注意: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) 额外的内存空间来解决它?

2. 题解

动态规划!!!动态规划!!!(其实第一反应是用递归求解,但是超时了

如果s3 可以由 s1s2 交错 组成,那么用一个二维数组DP可以比较直观的表示出交错方式。以示例 1为例,s1 = "aabcc"s2 = "dbbca"s3 = "aadbbcbcac",交错方式可表示如下:

16520654516544

如果路径最终能够到达二维数组右下角最后一个位置DP[-1][-1],则说明输入有解,返回True,否则返回False。但是如何判断路径能够到达右下角位置呢?可以对数组DP中数据进行编号(初始化为-1),起始位置为0,当DP更新完成之后,判断DP[-1][-1]的值是否等于S3.length即可,如图。

16520686031065

其中,灰色为初始化的数值,蓝色为起始位置,黄色为真正有效的交错路径,白底的则是不满足要求的可部分交错的一些位置。

接下来的问题就是,如何对二维数组DP进行更新,算法流程如下:

  1. 创建二维数组DP,大小为(s2.length+1)*(s1.length+1),所有数值初始化为-1
  2. DP[0][0]置为0,表示起始位置;
  3. 遍历DP数组每一个元素,因为在交错路径中,只能 向右 / 向下 移动(向右表示使用S1中一个字符,向下表示使用S2中一个字符),所以对于任意位置DP[i][j],我们只需要考虑其 左 / 上 位置的数值left / up(如果位置越界,则取其数值为-1即可)是否满足一定要求,然后对DP[i][j]进行数值更新即可:
    • 如果数值left >= 0,说明当前交错路径可以到达DP[i][j-1](即S3[left-1]可以与S1或者S2中的一个字符匹配)。这时我们需要判断路径是否可以右移到DP[i][j],即判断S3[left]是否与S1[j-1]匹配。如果匹配,则令DP[i][j] = left + 1
    • 如果数值up >= 0,说明当前交错路径可以到达DP[i-1][j](即S3[up-1]可以与S1或者S2中的一个字符匹配)。这时我们需要判断路径是否可以下移到DP[i][j],即判断S3[up]是否与S2[i-1]匹配。如果匹配,则令DP[i][j] = up + 1
  4. 整个数组DP更新完成之后,判断DP[-1][-1]是否等于S3.lenght

进阶 要求则需要创建一维数组DP,遍历时动态复用。

3. 代码实现

Python实现

class Solution:
    def isInterleave(self, s1: str, s2: str, s3: str) -> bool:
        # 一些可以直接返回结果的特殊情况
        if len(s1) + len(s2) != len(s3):
            return False
        if len(s1) + len(s2) == len(s3) == 0:
            return True
        
        # 一般情况
        n1 = len(s1)
        n2 = len(s2)
        n3 = len(s3)
        DP = [[-1] * (n1 + 1) for _ in range(n2 + 1)] 
        DP[0][0] = 0
        for i in range(n2 + 1):
            for j in range(n1 + 1):
                if i == 0 and j == 0:
                    continue
                left = DP[i][j-1] if j - 1 >= 0 else -1
                up   = DP[i-1][j] if i - 1 >= 0 else -1
                if left >= 0 and s3[left] == s1[j-1]:
                    DP[i][j] = left + 1
                if up >= 0 and s3[up] == s2[i-1]:
                    DP[i][j] = up + 1
                    
        return DP[-1][-1] == n3
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-10 12:08:32  更:2022-05-10 12:11:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:32:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码