Leetcode:97.交错字符串

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

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

  • 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 意味着字符串 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) 额外的内存空间来解决它?

还是直接上代码,特别简单的动态规划:

java 复制代码
class Solution {
    /**近乎白送分的题,一看就是动态规划,但是可能稍微复杂一点点的:三维的吗?
    三维也不是不能解,就是做起来比较麻烦,我们用二维来替代:既然s3的某个长度可以用s1的某个
    长度和s2的某个长度拼出,那这段里s3的长度肯定等于s1和s2之和 */
    public boolean isInterleave(String s1, String s2, String s3) {
        /**先转成字符数组方便操作 */
        char[] sArr1 = s1.toCharArray();
        char[] sArr2 = s2.toCharArray();
        char[] sArr3 = s3.toCharArray();
        int m = sArr1.length;
        int n = sArr2.length;
        int o = sArr3.length;
        if(m == 0 && n == 0 && o == 0) {
            return true;
        }
        if(m + n != o) {
            return false;
        }
        /**dp[i][j]表示s1的前i个字符和s2的前j个字符是否可以拼出s3的前i+j个字符*/
        boolean[][] dp = new boolean[m+1][n+1];
        /**s1的前0个字符和s2的前0个字符肯定能拼出s3的前0个字符*/
        dp[0][0] = true;
        /**初始化第一行和第一列,第一列是s1的前i个字符和s3的前i个字符是否相等*/
        for(int i = 1; i <= m ;i++) {
            dp[i][0] = dp[i - 1][0] && sArr1[i - 1] == sArr3[i-1];
        }
        /**第一列是s2的前j个字符和s3的前j个字符是否相等 */
        for(int j = 1; j <= n; j++) {
            dp[0][j] = dp[0][j - 1] && sArr2[j - 1] == sArr3[j - 1];
        }
        /**考虑一般的位置*/
        for(int i = 1; i <= m; i++) {
            for(int j = 1; j <= n; j++) {
                dp[i][j] = (dp[i-1][j] && sArr1[i - 1] == sArr3[i + j - 1]) || (dp[i][j - 1] && sArr2[j - 1] == sArr3[i + j - 1]);
            }
        }
        /**要求的是s1的整个和s2的整个能否拼出s3的整个 */
        return dp[m][n];
    }
}
相关推荐
GeW6 分钟前
RHCE学习拿证计划:锁定核心考点,实现备考效率最大化
linux
snow@li21 分钟前
服务器运维:Alibaba Cloud Linux 4 LTS 64位 根目录全景深度解析文章
linux·运维·服务器
苏生Susheng43 分钟前
【软件实施】Linux企业运维常用命令手册
java·linux·运维·服务器·springboot·springcloud·软件实施
额额额对了1 小时前
Linux 进程间通信(IPC)核心机制:消息队列、共享内存与信号量详解
linux·网络·网络协议
西索斯coding1 小时前
doubao-seed-2.1-turbo 调用一直 401 怎么办?pro 版同样的 Key 却正常——5 分钟排查定位指南
java·服务器·数据库·ai
zx_741484811 小时前
【Linux入门】Linux 安装:VMware Workstation Pro 安装 CentOS 7 保姆级图文教程
linux·centos
myy-learn2 小时前
31-TCP并发
服务器·网络·tcp/ip
智购科技无人售货机厂家2 小时前
2026自动售货机备用电池管理系统设计:从充放电保护到健康监测的工程实践~YH
大数据·linux·单片机·嵌入式硬件·微信
小雪崩2 小时前
嵌入式学习 day39:TCP并发服务器模型
linux·服务器·c语言·网络·学习·tcp/ip
智购无人售货机厂家2 小时前
2026自动售货机软硬件版本管理策略:从版本号规范到兼容性矩阵的工程实践~YH
运维·服务器·人工智能·单片机·嵌入式硬件·线性代数·矩阵