Interleaving String(交叉字符串)

http://www.lintcode.com/zh-cn/problem/interleaving-string/

public class Solution {
    /*
     * @param s1: A string
     * @param s2: A string
     * @param s3: A string
     * @return: Determine whether s3 is formed by interleaving of s1 and s2
     */
    public boolean isInterleave(String s1, String s2, String s3) {
        // write your code here
//        每个表示是否可以,行表示s1取前几个,列表示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 = 1; i < dp.length; i++) {
//            只取s1,不取s2,对于取i个的可行的条件是前i-1个可以并且第i个也可以
            dp[i][0] = dp[i - 1][0] && (s1.charAt(i - 1) == s3.charAt(i - 1));
        }
        for (int i = 1; i < dp[0].length; i++) {
//            只取s2,不取s1,对于取i个的可行的条件是前i - 1 个可以并且第i个也可以
            dp[0][i] = dp[0][i - 1] && (s2.charAt(i - 1) == s3.charAt(i - 1));
        }
        for (int i = 1; i < dp.length; i++) {
            for (int j = 1; j < dp[0].length; j++) {
//                对于s1取i个,s2取j个有两种情况,最后这次是取s1还是取s2,
//                如果取s1,那么要求s1的前i-1和s2的j是真,并且s1和第i个和s3的第i+j-1个是相等的。
//                如果取s2,那么要求s2的前j-1和s1的i是真,并且s2和第j个和s3的第i+j-1个是相等的。
//                两个有一个成立即可。
                dp[i][j] = dp[i - 1][j] && (s1.charAt(i-1) == s3.charAt(i + j - 1)) || dp[i][j - 1] && (s2.charAt(j-1) == s3.charAt(i + j - 1));
            }
        }
        return dp[dp.length - 1][dp[0].length - 1];
    }
}

你可能感兴趣的:(Interleaving String(交叉字符串))