Leetcode-Interleaving String
发布日期:2025-04-05 03:03:52 浏览次数:13 分类:精选文章

本文共 2050 字,大约阅读时间需要 6 分钟。

要判断一个字符串 s3 是否是由两个字符串 s1s2 交替组成,可以使用动态规划的方法。以下是详细的步骤:

方法思路

  • 检查长度:首先,检查 s3 的长度是否等于 s1s2 的长度之和。如果不等,直接返回 false
  • 初始化动态规划表:创建一个二维数组 dp,大小为 (len1 + 1) x (len2 + 1),用于存储状态。dp[i][j] 表示前 i 个字符来自 s1,前 j 个字符来自 s2 的情况下,是否可以组成 s3 的前 i + j 个字符。
  • 填充边界条件dp[0][0] 初始化为 true,表示空字符串可以组成空字符串。然后依次填充 i=0 的行和 j=0 的列。
  • 状态转移:对于每个 ij,检查 s3[i + j - 1] 是否等于 s1[i - 1]s2[j - 1],并根据前一个状态的值来更新当前状态。
  • 返回结果:最终返回 dp[len1][len2] 的值,即是否可以交替组成 s3
  • 解决代码

    public class Solution {    public boolean isInterleave(String s1, String s2, String s3) {        int len1 = s1.length();        int len2 = s2.length();        int len3 = s3.length();        // 检查总长度是否正确        if (len3 != len1 + len2) {            return false;        }        // 初始化动态规划表        boolean[][] dp = new boolean[len1 + 1][len2 + 1];        dp[0][0] = true;        // 填充i=0的情况        for (int j = 1; j <= len2; j++) {            if (dp[0][j - 1] && s3.charAt(j - 1) == s2.charAt(j - 1)) {                dp[0][j] = true;            } else {                dp[0][j] = false;            }        }        // 填充j=0的情况        for (int i = 1; i <= len1; i++) {            if (dp[i - 1][0] && s3.charAt(i - 1) == s1.charAt(i - 1)) {                dp[i][0] = true;            } else {                dp[i][0] = false;            }        }        // 填充主体部分        for (int i = 1; i <= len1; i++) {            for (int j = 1; j <= len2; j++) {                int currentPos = i + j - 1;                boolean canComeFromLeft = dp[i - 1][j] &&                     s3.charAt(currentPos) == s1.charAt(i - 1);                boolean canComeFromRight = dp[i][j - 1] &&                     s3.charAt(currentPos) == s2.charAt(j - 1);                dp[i][j] = canComeFromLeft || canComeFromRight;            }        }        return dp[len1][len2];    }}

    代码解释

  • 长度检查:首先检查 s3 的长度是否等于 s1s2 的长度之和,如果不等,直接返回 false
  • 动态规划表初始化:创建一个二维数组 dp,大小为 (len1 + 1) x (len2 + 1),并初始化 dp[0][0]true
  • 填充边界条件:填充 i=0 的行和 j=0 的列,分别表示只使用 s2s1 来组成 s3 的情况。
  • 状态转移:遍历每个 ij,检查当前字符是否匹配,并根据前一个状态的值更新当前状态。
  • 返回结果:最终返回 dp[len1][len2] 的值,表示是否可以交替组成 s3
  • 上一篇:LeetCode-Isomorphic Strings
    下一篇:Leetcode-Daily: Maximum Binary Tree

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年05月12日 14时01分51秒