97. Interleaving String

Given s1s2s3, 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.

---

 DP

---

Solution1 : 2维数组

public class Solution {
    

   public boolean isInterleave(String s1, String s2, String s3){
        if(s1.length() + s2.length() != s3.length()) return false;
        boolean[][] matched = new boolean[s1.length() + 1][s2.length() + 1];
        matched[0][0] = true;
        for(int i1 = 1; i1 <= s1.length(); i1++){
            if(s3.charAt(i1-1) == s1.charAt(i1-1)) {
                matched[i1][0] = true;
            }else break;
        }
        for(int i2 = 1; i2 <= s2.length(); i2++){
            if(s3.charAt(i2 - 1) == s2.charAt(i2 - 1)) {
                matched[0][i2] = true;
            }else break;
        }
        
        for(int i1 = 1; i1 <= s1.length(); i1++){
            char c1 = s1.charAt(i1 - 1);
            for(int i2 = 1; i2 <= s2.length(); i2++){
                int i3 = i1 + i2;
                char c2 = s2.charAt(i2 - 1);
                char c3 = s3.charAt(i3 - 1);
                if(c1 == c3){
                    matched[i1][i2] = matched[i1 - 1][i2];
                }
                if(c2 == c3){
                    matched[i1][i2] |= matched[i1][i2 - 1];
                }
            }
        }
        return matched[s1.length()][s2.length()];
    }
}

---

Solution2: 一维滚动数组

public class Solution {
    

    public boolean isInterleave(String s1, String s2, String s3) {
        
        if(s1.length() + s2.length() != s3.length())
            return false;
        
        boolean[] interleaved = new boolean[s2.length() + 1];
        interleaved[0] = true;
        
        for(int i = 0; i <= s1.length(); i++)
            for(int j = 0; j <= s2.length(); j++){
                if(i>=1)
                    interleaved[j] = interleaved[j] & (s1.charAt(i - 1) == s3.charAt(i + j - 1));
                if(j>=1)
                    interleaved[j] |= interleaved[j - 1] & (s2.charAt(j - 1) == s3.charAt(i + j - 1));
            }

        return interleaved[s2.length()];
    } 
      
}

 

posted @ 2013-09-21 11:59  LEDYC  阅读(142)  评论(0)    收藏  举报