Leetcode解题报告——97. Interleaving String

题目要求:
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.

For example,
Given:
s1 = "aabcc",
s2 = "dbbca",

When s3 = "aadbbcbcac", return true.
When s3 = "aadbbbaccc", return false

简单解释下,判断s3是否由s1s2交替组成,即s3前n位字符由s1的前 n-i 位字符和 s2的前 i 位字符组成。

这是个典型的动态规划问题。我们保留一个二维数组 dp,
dp[i][j] 表示 s3 的前 i+j 位 字符 是否由 s1 的前 i 位 和 s2的前 j 位组成。
在已知dp[i-1][j]dp[i][j-1]的情况下,欲求dp[i][j],只需思考s3的第 i+j 位字符 来自 s1 的第 i 个字符 还是 s2的第 j 个字符,以及是否相等。
所以其递推公式为:dp[i][j] = (s1[i-1] == s3[i+j-1] && dp[i-1][j]) || (s2[j-1] == s3[i+j-1] && dp[i][j-1]

  • 全部代码
   public  boolean isInterleave(String s1, String s2, String s3) {
        if (s3.length() != s1.length() + s2.length()) return false;

        boolean[][]dp = new boolean[s1.length()+1][s2.length()+1];
        //初始化边界
        dp[0][0] = true;  
        for (int i = 1; i <=s1.length() ; i++) {
            dp[i][0] = s3.charAt(i-1) == s1.charAt(i-1) ? dp[i-1][0]:false;
        }

        for (int i = 1; i <=s2.length() ; i++) {
            dp[0][i] = s3.charAt(i-1) == s2.charAt(i-1) ? dp[0][i-1]:false;
        }

        for (int i = 1; i <=s1.length() ; i++) {
            for (int j = 1; j <=s2.length() ; j++) {
                char v3 = s3.charAt(i+j-1);
                boolean v1 = v3 == s1.charAt(i-1) ? dp[i-1][j]:false;
                boolean v2 = v3 == s2.charAt(j-1) ? dp[i][j-1]:false;
                dp[i][j] = v1 || v2;
            }
        }
        return dp[s1.length()][s2.length()];

    }

你可能感兴趣的:(Leetcode解题报告——97. Interleaving String)