CVTE 2018 实习笔试题:判断字符串A,B是否可以组成C

题目:

判断字符串A,B是否可以组成C

如:A  "bbcdd"  B "eccdb" C "bbeccdcdbd"

此时是可以的。

思路:

这是一道动态规划问题,首先最重要的就是定义状态:

f(i,j): A[0-i] 跟 B[0-j] 是否可以组成 C[0-(i+j)]

如若可以,那么f(i,j)为true, 如果不可以,f(i,j)为false。

然后状态转移方程可以写出:

f(i,j)=(f(i-1,j)&A[i]==c[i+j]) | f(i,j-1)&B[i]==c[i+j])

最后我们给出代码:

    public static boolean isInterleave(String a, String b, String c){
        int m = a.length();
        int n = b.length();
        if(m+n!=c.length()){return false;}          // 长度不一致
        boolean arr[][] = new boolean[m+1][n+1];
        // 初始化arr数组
        arr[0][0] = true;
        for (int i = 1; i <= n; i++) {
            arr[0][i] = arr[0][i-1] & (b.charAt(i-1)==c.charAt(i-1));
        }
        for (int i = 1; i <= m; i++) {
            arr[i][0] = arr[i-1][0] & (a.charAt(i-1)==c.charAt(i-1));
        }
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                arr[i][j] = (arr[i][j-1] & b.charAt(j-1)==c.charAt(i+j-1)) | (arr[i-1][j] & a.charAt(i-1)==c.charAt(i+j-1));
            }
        }
        return arr[m][n];
    }

测试代码:

    public static void main(String[] args) {
        String a = "bbcdd";
        String b = "eccdb";
        String c = "bbeccdcdbd";
        System.out.println(isInterleave(a, b, c));
    }

结果:

true false false false false false 
true false false false false false 
true true true true true false 
false true true false true false 
false false true true true true 
false false false true false true 
true

你可能感兴趣的:(LeetCode)