这里我们考虑用 s1和 s2的某个前缀是否能形成 s3 的一个前缀。

这个方法的前提建立于:判断一个 s3的前缀(用下标 k表示),能否用 s1和 s2 的前缀(下标分别为 i和 j),仅仅依赖于 s1 前 i个字符和 s2 前 j个字符,而与后面的字符无关。

为了实现这个算法, 我们将使用一个 2D 的布尔数组 dp 。dp[i][j]表示用 s1的前 i和 s2的前 j个字符,总共 i+j个字符,是否交错构成 s3的前缀。为了求出 dp[i][j] ,我们需要考虑 两 种情况:

s1的第 i 个字符和 s2 的第 j 个字符都不能匹配 s3的第 k 个字符,其中 k=i + j 。这种情况下,s1和 s2的前缀无法交错形成 s3长度为 k 的前缀。因此,我们让 dp[i][j]为 False。

s1的第 i 个字符或者 s2的第 j 个字符可以匹配 s3的第 k个字符,其中 k=i+j 。假设匹配的字符是 x 且与 s1的第 i 个字符匹配,我们就需要把 x放在已经形成的交错字符串的最后一个位置。此时,为了我们必须确保 s1的前 (i-1)个字符和 s2的前 j 个字符能形成 s3的一个前缀。类似的,如果我们将 s2的第 j个字符与 s3的第 k 个字符匹配,我们需要确保 s1的前 i 个字符和 s2的前 (j-1) 个字符能形成 s3的一个前缀,我们就让 dp[i][j]为True 。

public class Solution {public bool IsInterleave(string s1, string s2, string s3){if((s1.Length  + s2.Length) != s3.Length)return false;bool[,] dp = new bool[s1.Length + 1, s2.Length + 1];for(int i = 0; i <= s1.Length; i++){for(int j = 0; j <= s2.Length; j++){if(i == 0 && j == 0)dp[i, j] = true;else if(i == 0)dp[i, j] = dp[i, j - 1] && s2[j - 1] == s3[i+ j - 1];else if(j == 0)dp[i, j] = dp[i - 1, j] && s1[i - 1] == s3[i+ j - 1];elsedp[i, j] = (dp[i - 1, j] && s1[i - 1] == s3[i+ j - 1]) || dp[i, j - 1] && s2[j - 1] == s3[i+ j - 1];}}return dp[s1.Length, s2.Length];}
}

复杂度分析

时间复杂度:O(m \cdot n)O(m⋅n) 。计算 dpdp 数组需要 m*nm∗n 的时间。

空间复杂度:O(m \cdot n)O(m⋅n)。2 维的 dpdp 数组需要 (m+1)*(n+1)(m+1)∗(n+1) 的空间。 mm 和 nn 分别是 s1s1 和 s2s2 字符串的长度。

优化:使用一维动态规划

这种方法与前一种方法基本一致,除了我们仅使用一维 dp数组去储存前缀结果。我们利用 dp[i-1]的结果和 dp[i]之前的结果来计算 dp[i],即滚动数组。

public bool IsInterleave(string s1, string s2, string s3){if((s1.Length  + s2.Length) != s3.Length)return false;bool[] dp = new bool[s2.Length + 1];for(int i = 0; i <= s1.Length; i++){for(int j = 0; j <= s2.Length; j++){if(i==0 && j == 0)dp[j] = true;else if(i == 0)dp[j] = dp[j - 1] && s2[j - 1] == s3[i+ j - 1];else if(j == 0)dp[j] = dp[j] && s1[i - 1] == s3[i+ j - 1];elsedp[j] = (dp[j] && s1[i - 1] == s3[i+ j - 1]) || dp[j - 1] && s2[j - 1] == s3[i+ j - 1];}}return dp[s2.Length];}

复杂度分析

时间复杂度:O(m⋅n);长度为 n 的 dp数组需要被填充 m 次。

空间复杂度:O(n);n是字符串 s1的长度

LeetCode 97: 交错字符串相关推荐

  1. LeetCode 97交错字符串(动态规划)

    微信搜一搜:bigsai 大家都在关注的刷题.学习数据结构和算法宝藏项目 关注回复进群即可加入力扣打卡群,欢迎划水.近期打卡: LeetCode 92反转链表Ⅱ&93复制ip地址&94 ...

  2. LeetCode 97. 交错字符串(DP)

    1. 题目 给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的. 示例 1: 输入: s1 = "aabcc", s2 = "dbb ...

  3. LeetCode 97. 交错字符串(动态规划)

    题目描述 给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的. 示例 1: 输入: s1 = "aabcc", s2 = "dbbc ...

  4. 力扣刷题笔记 97. 交错字符串 C#

    7月18日签到题,题目如下: 给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的. 示例 1: 输入:s1 = "aabcc", s2 = & ...

  5. 97. 交错字符串 java解决

    题目描述: 难度:中等 相关标签:字符串.动态规划给定三个字符串s1.s2.s3,请你帮忙验证s3是否是由s1和s2 交错 组成的. 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会 ...

  6. C#LeetCode刷题-字符串

    字符串篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串 24.6% 中等 5 最长回文子串 22.4% 中等 6 Z字形变换 35.8% 中等 8 字符串转整数 (atoi) 15.3% 中 ...

  7. 【JAVA】交错字符串——力扣每日一题(六)(2020.07.18)

    目录 题目:97. 交错字符串 思路 如果你从本文中学习到丝毫知识,那么请您点点关注.点赞.评论和收藏 大家好,我是爱做梦的鱼,我是东北大学大数据实验班大三的小菜鸡,非常渴望优秀,羡慕优秀的人,个人博 ...

  8. C#版(击败97.76%的提交) - Leetcode 557. 反转字符串中的单词 III - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. Leetcod ...

  9. 【重点!DP】LeetCode 97. Interleaving String

    LeetCode 97. Interleaving String 参考网址:[1]https://www.youtube.com/watch?v=HmAF9xeS_2I [2]http://www.c ...

最新文章

  1. java学习之成员内部类
  2. 从谷歌AutoML到百度EasyDL,AI大生产时代,调参师不再是刚需
  3. 在这场人工智能“战争”中,这些国家都在做些什么?
  4. 大连理工大学c语言第三次上机作业答案,大连理工大学软件学院C语言上机第五六章课后题...
  5. ubuntu在线安装和卸载libusb
  6. vertx rest 跨域_在基于简单Vertx Rest的应用程序上为REST资源设置基本响应HTTP标头...
  7. idea 执行 java jar_idea打包java可执行jar包的实现步骤
  8. LINUX系统中动态链接库的创建和使用
  9. MOOS学习笔记3——命令行
  10. python解释器哪个版本好_python解释器有几种
  11. python中pdfplumber解析pdf_Python中pdfplumber如何提取pdf中的表格数据
  12. PMAC应用六-前瞻
  13. 托科技的福,学不好外语就别学了!| 技术前沿洞察
  14. 圣诞节海报做了吗?为你准备了圣诞素材
  15. 科学家发现斯格明子霍尔效应:可造新型电子储存器
  16. centos8修改网卡配置及应用
  17. Swift语法基础:19 - Swift的控制转移的语句, Continue, Break, Fallthrough, Labeled Statements...
  18. easyswoole默认访问html,easyswoole安装报错 解决办法
  19. ITIL 4存在的必要性
  20. 22西电网信953上岸

热门文章

  1. model模型php,thinkphp的model模型的设计经验总结
  2. 一篇文章学会mysql_一篇文章帮你搞定所有MySQL命令!
  3. 设有n个正整数,将它们排成一排,组成一个最大的多位整数
  4. Super Mario HDU - 4417(主席树解决区间数字小于k的个数||线段树+离线)
  5. 管理维护MySQL的SQL语句有哪些_MySQL常用管理SQL语句
  6. python 字典 内存_Python 字典(联合内存、联合数组)
  7. PAT_B_1047_Java(20分)
  8. generator mysql插件_mybatis Generator最佳实践(数据库:mysql)
  9. python打卡摄像头黑屏_500行Python代码打造刷脸考勤系统 !
  10. Java学习_强制类型转换