Description

Given three strings: s1, s2, s3, determine whether s3 _is formed by the interleaving of _s1 _and _s2.

Example

For s1 ="aabcc", s2 ="dbbca"When s3 ="aadbbcbcac", returntrue.When s3 ="aadbbbaccc", returnfalse.

Solution

初始状态dp[i][0] = s3.charAt(i - 1) == s1.charAt(i - 1);dp[0][j] = s3.charAt(j - 1) == s2.charAt(j - 1);
状态方程dp[i][j] = (s3.charAt(i + j - 1) == s1.charAt(i - 1) && dp[i - 1][j]) || (s3.charAt(i + j - 1) == s2.charAt(j - 1) && dp[i][j - 1]);

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
        if (s1 == null || s2 == null || s3 == null) {
            return false;
        }

        int len1 = s1.length();
        int len2 = s2.length();
        int len3 = s3.length();

        if (len1 + len2 != len3) {
            return false;
        }

        if (len1 == 0 && len2 == 0) {
            return true;
        }

        boolean[][] dp = new boolean[len1 + 1][len2 + 1];
        dp[0][0] = true;

        for (int i = 1; i <= len1; i++) {
            dp[i][0] = s3.charAt(i - 1) == s1.charAt(i - 1);
        }

        for (int j = 1; j <= len2; j++) {
            dp[0][j] = s3.charAt(j - 1) == s2.charAt(j - 1);
        }

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

        return dp[len1][len2];
    }
}

results matching ""

    No results matching ""