Leetcode JAVA刷刷站(97)交错字符串

一、题目概述

二、思路方向 

        为了验证字符串 s3 是否由 s1 和 s2 交错组成,我们可以使用动态规划(Dynamic Programming, DP)的方法来解决这个问题。

       首先,我们需要定义状态 dp[i][j],它表示 s1 的前 i 个字符和 s2 的前 j 个字符是否能交错组成 s3 的前 i+j 个字符。

        接下来,我们考虑状态转移方程:

  • 如果 s1[i-1] == s3[i+j-1](即 s1 的第 i 个字符与 s3 的第 i+j 个字符相等),那么 dp[i][j] 可以从 dp[i-1][j] 转移而来,即 s1 的前 i-1 个字符和 s2 的前 j 个字符交错组成 s3 的前 i+j-1 个字符后,再加上 s1 的第 i 个字符。
  • 同理,如果 s2[j-1] == s3[i+j-1](即 s2 的第 j 个字符与 s3 的第 i+j 个字符相等),那么 dp[i][j] 可以从 dp[i][j-1] 转移而来。

初始条件为:

  • dp[0][0] = true,因为两个空字符串可以交错组成空字符串。
  • 对于 dp[0][j]j > 0),只有当 s2 的前 j 个字符与 s3 的前 j 个字符完全相等时,dp[0][j] 才为 true
  • 同理,对于 dp[i][0]i > 0),只有当 s1 的前 i 个字符与 s3 的前 i 个字符完全相等时,dp[i][0] 才为 true

       最后,我们只需要检查 dp[len(s1)][len(s2)] 是否为 true,其中len(s1) 和 len(s2) 分别是 s1 和 s2 的长度。

三、代码实现 

public class Solution {  
    public boolean isInterleave(String s1, String s2, String s3) {  
        int len1 = s1.length(), len2 = s2.length(), len3 = s3.length();  
        if (len1 + len2 != len3) {  
            return false; // 长度不匹配,直接返回false  
        }  
  
        boolean[][] dp = new boolean[len1 + 1][len2 + 1];  
        dp[0][0] = true; // 初始化  
  
        // 初始化第一行  
        for (int j = 1; j <= len2; j++) {  
            dp[0][j] = dp[0][j - 1] && s2.charAt(j - 1) == s3.charAt(j - 1);  
        }  
  
        // 初始化第一列  
        for (int i = 1; i <= len1; i++) {  
            dp[i][0] = dp[i - 1][0] && s1.charAt(i - 1) == s3.charAt(i - 1);  
        }  
  
        // 填充DP表  
        for (int i = 1; i <= len1; i++) {  
            for (int j = 1; j <= len2; j++) {  
                dp[i][j] = (dp[i - 1][j] && s1.charAt(i - 1) == s3.charAt(i + j - 1)) ||  
                           (dp[i][j - 1] && s2.charAt(j - 1) == s3.charAt(i + j - 1));  
            }  
        }  
  
        return dp[len1][len2];  
    }  
  
    public static void main(String[] args) {  
        Solution solution = new Solution();  
        String s1 = "aab";  
        String s2 = "axb";  
        String s3 = "aabxb";  
        System.out.println(solution.isInterleave(s1, s2, s3)); // 输出 true  
    }  
}

执行结果: 

四、小结

        这段代码定义了一个 isInterleave 方法来判断 s3 是否可以由 s1 和 s2 交错组成,并在 main 方法中给出了两个示例来验证其正确性。

 结语  

愿你在人生的每一个阶段

都能遇见最好的自己

收获满满的幸福与成就

!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT 青年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值