[97. 交错字符串]

[97. 交错字符串]

给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1s2 交错组成的。

示例 1:

输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
输出: true

示例 2:

输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
输出: false

思路:经典的动态规划问题

dp[i][j]s1的前i个字符和s2的前j个字符是否符合, dp[0][0] == true

递推方程:

dp[i][j] = (dp[i-1][j]&(s1[i-1]==s3[i+j-1])) | (dp[i][j-1]&(s2[j-1]==s3[i+j-1]))

注意边界即可

优化:由于计算当前状态只会用到二位矩阵中的上面和左面的状态,可以将空间复杂度优化为O(n)

public boolean isInterleave(String s1, String s2, String s3) {

        if(s1.length() + s2.length() != s3.length()){
            return false;
        }
        boolean[][] dp = new boolean[s1.length()+1][s2.length()+1];
        dp[0][0] = true;

        for (int i = 0; i <= s1.length(); i++) {
            for (int j = 0; j <= s2.length(); j++) {
                if(j > 0){
                    dp[i][j] |= dp[i][j-1] & (s2.charAt(j-1) == s3.charAt(i+j-1));
                }
                if(i > 0){
                    dp[i][j] |= dp[i-1][j] & (s1.charAt(i-1) == s3.charAt(i+j-1));
                }
            }
        }

        return dp[s1.length()][s2.length()];

    }
因为我喜欢追寻过程中的自己
原文地址:https://www.cnblogs.com/IzuruKamuku/p/14359749.html