LeetCode Interleaving String

Given three strings: s1s2s3, determine whether s3 is formed by the interleaving of s1 and s2.

Example

For s1 = "aabcc", s2 = "dbbca"

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

解题思路:简历辅助空间dp[s1.lenght()+1][s2.length()+1],dp[i][j]代表的是s[0...i-1]和s2[0..j-1]能否交错组成s3[i+j-1]

dp[i][j]的取值决策:

1、s[i-1]= s3[i+j-1],那么dp[i][j] 的值由s1[i-2]和s2[j-1]是否交错组成s3[i+j-2],也就是dp[i-1][j]是否为true;

2、s2[j-1] = s3[i+j-1],那么dp[i][j] 的值由s1[i-1]和s2[j-2]是否交错组成s3[i+j-2],也就是dp[i-1][j]是否为true

根据以上情况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],否则为false;

package cn.edu.algorithm.huawei;

public class Solution {
    /**
     * Determine whether s3 is formed by interleaving of s1 and s2.
     *
     * @param s1, s2, s3: As description.
     * @return: true or false.
     */
    public boolean isInterleave(String s1, String s2, String s3) {

        if (s1.length() + s2.length() != s3.length())
            return false;
        if (s1 == null || s1.length() == 0)
            return s2.equals(s3);
        if (s2 == null || s2.length() == 0)
            return s1.equals(s3);

        boolean[][] dp = new boolean[s1.length() + 1][s2.length() + 1];
        char[] arr1 = s1.toCharArray();
        char[] arr2 = s2.toCharArray();
        char[] arr3 = s3.toCharArray();

        dp[0][0] = true;
        for (int i = 1; i <= s1.length(); i++) {
            if (arr1[i - 1] != arr3[i - 1]) {
                break;
            }
            dp[i][0] = true;
        }

        for (int j = 1; j <= s2.length(); j++) {
            if (arr2[j - 1] != arr3[j - 1]) {
                break;
            }
            dp[0][j] = true;
        }

        for (int i = 1; i <= s1.length(); i++) {
            for (int j = 1; j <= s2.length(); j++) {
                if (arr1[i - 1] == arr3[i + j - 1] && dp[i - 1][j] || arr2[j - 1] == arr3[i + j - 1] && dp[i][j - 1]) {
                    dp[i][j] = true;
                }
            }
        }
        return dp[s1.length()][s2.length()];
    }

    public static void main(String[] args) {
        String s1 = "abbcddef";
        String s2 = "accbbbcd";
        String s3 = "abbcddefaccbbbcd";
        Solution s = new Solution();
        System.out.println(s.isInterleave(s1, s2, s3));
    }
}

该代码还可以进行空间压缩

posted @ 2016-09-03 21:17  googlemeoften  阅读(201)  评论(0编辑  收藏  举报