java动态规划-交错字符串

给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。
两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:
输入:s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”
输出:true
输入:s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”
输出:false
思路
定义一个二维boolean类型的dp数组dp[n][m],n表示s1的字符下标,m表示s2的字符小标,而dp[n][m]表示s1的n下标和s2的m下标的字符是否匹配s3的字符,递推公式:dp[n][m]=dp[n-1][m]&&s1(n-1) == s3(m+n-1) || dp[n][m-1]&&s2(m-1) == s3(m+n-1)
代码

    public boolean isInterleave(String s1, String s2, String s3) {
    
    
        int n=s1.length(),m=s2.length();
        //如果长度不相等则不可能匹配
        if (n+m!=s3.length())
            return false;
        // 定义一个数组,n表示s1的字符下标,m表示s2的字符下标,dp表示是否匹配s3
        boolean[][] dp=new boolean[n+1][m+1];
        dp[0][0]=true;//初始化为true
        for (int i = 0; i <= n; i++) {
    
    
            for (int j = 0; j <= m; j++) {
    
    
                int p=i+j-1;
                if (i>0)//防止越界
                    //判断s1字符是否与s3字符匹配
                    dp[i][j]=dp[i][j]||(dp[i-1][j]&&s1.charAt(i-1)==s3.charAt(p));
                if (j>0)//防止越界
                    //判断s2字符是否与s3字符匹配
                    dp[i][j]=dp[i][j]||(dp[i][j-1]&&s2.charAt(j-1)==s3.charAt(p));
            }
        }
        return dp[n][m];
    }

Guess you like

Origin blog.csdn.net/qq_45598422/article/details/121334938