interleaving-string(交错字符串)

本文主要解析了LeetCode上的交错字符串问题,详细介绍了分析过程和提供了代码实现,帮助理解解题思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、题目

给定s1,s2,s3,找出s3是否由s1和s2的交织形成。
例如,
鉴于:
s1 =“aabcc”,
s2 =“dbbca”,
当s3 =“aadbbcbcac”时,返回true。
当s3 =“aadbbbaccc”时,返回false。

2、分析过程

动态规划:
dp[i][j] 表示 s2 的前 i 个字符和 s1 的前 j 个字符是否匹配 s3 的前 i+j 个字符。
初始化dp[0][0]=0,dp[0][j]表示s2取0个,即s1的前j个字符是否匹配s3的前j个字符;dp[i][0]表示s1取0个,即s2的前i个字符,是否匹配s3的前i个字符。
动规方程:dp[i][j] = dp[i - 1][j] && s2[i - 1] == s3[i + j - 1]  ||  dp[i][j - 1] && s1[i][j - 1] == s3[i + j - 1] ,意思是如果s2的前i-1个字符和s1的前j个字符已经和s3的前i+j-1个字符匹配且s2的第i个字符等于s3的第i+j个字符,或者s2的前i个字符和s1的前j-1个字符已经和s3的前i+j-1个字符匹配,且s1的第j个字符等于s3的第i+j个字符,那么s2的前i个字符和s1的前j个字符能否与s3的前i+j-1个字符匹配。

3、代码实现

public class Solution {
    public boolean isInterleave(String s1, String s2, String s3) {
        if(s1==null || s2==null || s3==null || s1.length()+s2.length()!=s3.length()){
            return false;
        }
        int n1=s1.length();
        int n2=s2.length();
        int n3=s3.length();
        boolean [][] dp=new boolean [n1+1][n2+1];//dp[i][j]表示s1中的前i个字符和s2的前j个字符是否能组成s3的前i+j个字符
        //初始化dp数组
        dp[0][0]=true;
        for(int i=1;i<=n1;i++){
            if(dp[i-1][0] && s1.charAt(i-1)==s3.charAt(i-1)){
                dp[i][0] =true;
            }else{
                dp[i][0]=false;
            }
        }
        for(int i=1;i<=n2;i++){
            if(dp[0][i-1] && s2.charAt(i-1)==s3.charAt(i-1)){
                dp[0][i] =true;
            }else{
                dp[0][i]=false;
            }
        }

        for(int i=1;i<=n1;i++){
            for(int j=1;j<=n2;j++){
                if(dp[i-1][j]){
                    if(s1.charAt(i-1)==s3.charAt(i+j-1)){
                        dp[i][j]=true;
                    }
                }else if(dp[i][j-1]){
                    if(s2.charAt(j-1)==s3.charAt(i+j-1)){
                        dp[i][j]=true;
                    }
                }else{
                    dp[i][j]=false;
                }
            }
        }

        return dp[n1][n2];
    }
}

题目来自:牛客网leetCode

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值