【问题描述】[中等]

【解答思路】

1. 动态规划

第 1 步:设计状态
f(i,j) 表示 s 1的前 i个元素和 s2 的前 j个元素是否能交错组成 s3的前 i + j 个元素

第 2 步:状态转移方程

p = i + j - 1 p为s3的长度

第 3 步:考虑初始化
boolean[][] f = new boolean[n + 1][m + 1];
f(0,0)=True
第 4 步:考虑输出
f[n][m];

第 5 步:考虑是否可以状态压缩

时间复杂度:O(NM) 空间复杂度:O(NM)

class Solution {public boolean isInterleave(String s1, String s2, String s3) {int n = s1.length(), m = s2.length(), t = s3.length();
//长度之和都不等,肯定无法由s1和s2交替组成s3if (n + m != t) {return false;}boolean[][] f = new boolean[n + 1][m + 1];
//边界条件:认为s1的前0个字符和s2的前0个字符,可以交替组成s3的前0个字符f[0][0] = true;for (int i = 0; i <= n; ++i) {for (int j = 0; j <= m; ++j) {int p = i + j - 1;if (i > 0) {//官方代码前面这个'f[i][j] ||'是没必要的f[i][j] = f[i][j] || (f[i - 1][j] && s1.charAt(i - 1) == s3.charAt(p));}if (j > 0) {//如果前一步i>0时已算出f[i][j]为true,则下面的||会短路,f[i][j]直接就是true了f[i][j] = f[i][j] || (f[i][j - 1] && s2.charAt(j - 1) == s3.charAt(p));}}}
//返回结果:s1的前n个字符和s2的前m个字符,可否交替组成s3的前n+m个字符return f[n][m];}
}

时间复杂度:O(NM) 空间复杂度:O(M)

class Solution {public boolean isInterleave(String s1, String s2, String s3) {int n = s1.length(), m = s2.length(), t = s3.length();if (n + m != t) {return false;}boolean[] f = new boolean[m + 1];f[0] = true;for (int i = 0; i <= n; ++i) {for (int j = 0; j <= m; ++j) {int p = i + j - 1;if (i > 0) {f[j] = f[j] && s1.charAt(i - 1) == s3.charAt(p);}if (j > 0) {f[j] = f[j] || (f[j - 1] && s2.charAt(j - 1) == s3.charAt(p));}}}return f[m];}
}
2. BFS

时间复杂度:O(NM) 空间复杂度:O(NM)

class Solution {public boolean isInterleave(String s1, String s2, String s3) {int n1 = s1.length();int n2 = s2.length();int n3 = s3.length();if (n1 + n2 != n3) return false;//判断是否已经遍历过boolean[][] visited = new boolean[n1 + 1][n2 + 1];Queue<int[]> queue = new LinkedList<>();queue.offer(new int[]{0, 0});while (!queue.isEmpty()) {int[] tmp = queue.poll();/到达右下角就返回 trueif (tmp[0] == n1 && tmp[1] == n2) return true;/ 尝试是否能向右走if (tmp[0] < n1 && s1.charAt(tmp[0]) == s3.charAt(tmp[0] + tmp[1]) && !visited[tmp[0] + 1][tmp[1]]) {visited[tmp[0] + 1][tmp[1]] = true;queue.offer(new int[]{tmp[0] + 1, tmp[1]});}/ 尝试是否能向下走if (tmp[1] < n2 && s2.charAt(tmp[1]) == s3.charAt(tmp[0] + tmp[1]) && !visited[tmp[0]][tmp[1] + 1]) {visited[tmp[0]][tmp[1] + 1] = true;queue.offer(new int[]{tmp[0], tmp[1] + 1});}}return false;}
}

【总结】

1. 动态规划流程

第 1 步:设计状态
第 2 步:状态转移方程
第 3 步:考虑初始化
第 4 步:考虑输出
第 5 步:考虑是否可以状态压缩

2. BFS DFS 遍历好助手

转载链接:https://leetcode-cn.com/problems/interleaving-string/solution/jiao-cuo-zi-fu-chuan-by-leetcode-solution/
参考链接:https://leetcode-cn.com/problems/interleaving-string/solution/dong-tai-gui-hua-he-bfs-by-powcai/

参考链接:https://leetcode-cn.com/problems/interleaving-string/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-2-9/

[Leetcode][第97题][JAVA][交错字符串][BFS][动态规划]相关推荐

  1. [Leetcode][第557题][JAVA][反转字符串中的单词 III][遍历][String函数]

    [问题描述][简单] [解答思路] 1. 遍历 开辟一个新字符串.然后从头到尾遍历原字符串,直到找到空格为止,此时找到了一个单词,并能得到单词的起止位置.随后,根据单词的起止位置,可以将该单词逆序放到 ...

  2. [Leetcode][第785题][JAVA][判断二分图][BFS][DFS]

    [问题描述][中等] [解答思路] 1. DFS 深度优先遍历 时间复杂度:O(N+M) 空间复杂度:O(N) class Solution {private static final int UNC ...

  3. [Leetcode][第733题][JAVA][图像渲染][BFS][DFS]

    [问题描述][简单] [解答思路] 千万不要想复杂了 不是三维空间 是一维空间 ! 本题要求将给定的二维数组中指定的「色块」染成另一种颜色.「色块」的定义是:直接或间接相邻的同色方格构成的整体. 可以 ...

  4. [Leetcode][第337题][JAVA][打家劫舍3][递归][动态规划]

    [问题描述][中等] [解答思路] 1. 动态规划 第 1 步:状态定义 dp[node][j] :这里 node 表示一个结点,以 node 为根结点的树,并且规定了 node 是否偷取能够获得的最 ...

  5. [Leetcode][第647题][JAVA][回文子串][动态规划][中心扩展][Manacher 算法]

    [问题描述][中等] [解答思路] 1. 暴力 首先明确如何判断一个字符串是否为回文字符串.第一个字符与最后一个字符相同,第二个字符与倒数第二个字符相同-关于中心位置轴对称. 本题要求一共有多少个回文 ...

  6. [Leetcode][第44题][JAVA][通配符匹配][贪心][动态规划]

    [问题描述][困难] [解答思路] 1. 动态规划 第 1 步:设计状态 dp[i][j]dp[i][j] 表示字符串 ss 的前 ii 个字符和模式 pp 的前 jj 个字符是否能匹配 第 2 步: ...

  7. [Leetcode][第174题][JAVA][地下城游戏][DFS][动态规划]

    [问题描述][中等] [解答思路] 1. 回溯(暴力)& 优化 超时,需要优化 public int calculateMinimumHP(int[][] dungeon) {if (dung ...

  8. [Leetcode][第63题][JAVA][不同路径2][动态规划][压缩路径]

    [问题描述][中等] [解答思路] 1. 动态规划流程 第 1 步:设计状态 第 2 步:状态转移方程 第 3 步:考虑初始化 第一行第一列 没有遇到"障碍" 就为1 如果u(i, ...

  9. [Leetcode][第111题][JAVA][BFS][二叉树的最小深度][BFS][递归]

    [问题描述][简单] [解答思路] 1. 递归 自下而上 基本情况/结束条件 : 叶子节点的定义是左孩子和右孩子都为 null 时叫做叶子节点 当 root 节点左右孩子都为空时,返回 1 当 roo ...

最新文章

  1. 如何使用Leangoo敏捷工具做测试管理。
  2. MySQL使用正则表达式
  3. nodejsmongoangularjs
  4. 创业动力衰减 中国面临危险挑战
  5. pdo mysql下载,yum安装mysql5.7 和 pdo_mysql扩展
  6. 他是Facebook广告投入费用过亿的独立站卖家
  7. 洛谷P2486 [SDOI2011]染色
  8. Android 学习笔记(十五):Activity-GalleryView
  9. 关于STM32Flash详解
  10. java jsessionid_关于JSESSIONID
  11. 概率论与数理统计 答案
  12. cache文件夹可以删除吗
  13. Python绘制二元函数图像
  14. 如何把网站从万网转到百度的服务器,百度域名服务上线“域名转入”功能 附转入教程...
  15. 经典运放电路详细分析(模拟电子技术)
  16. badwords.php,ucenter中词语过滤原理分析
  17. Java--面向对象_中
  18. ffmpeg 图片转视频
  19. Python一帮一学习小组
  20. 综合布线包括计算机网络,综合布线试题

热门文章

  1. js Date对象总结
  2. 观察者模式与Boost.Signals
  3. 数据类型、常量、变量
  4. Ubuntu 8.04下Netbeans的字体反锯齿解决(转)
  5. Jenkins构建 netcore5.0 项目时出现NU3028/NU3037错误的解决方案
  6. android记事本项目案例,Android实现记事本项目完整实例源代码
  7. oracle已经有了注释符再注释,关于oracle的注释位置
  8. hexo 环境变量_小白使用 Github + Hexo 从 0 搭建一个博客
  9. Asp.Net微信发布菜单,出现“invalid sub button url domain hint”错误
  10. 67-Flutter中高德地图插件的使用