Leetcode-Interleaving String

LiBlog發表於2014-11-24

Given s1, s2, s3, 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.

Analysis:

Initially, we consider the state d[k,i,j] as whether the first k chars in s3 is the interleaving string of the first i chars of s1 and the first j chars of s2. We then have the formula:

d[k,i,j] = d[k-1][i-1][j] && s3[k]==s1[i]  || d[k-1][i][j-1] && s3[k]==s2[j].

We then find that since a state d[k,i,j] has meaning only when k==(i+j), we actaully can reduce the number of states. We further use the state d[i,j] to present whether the s1[0-(i-1)] and s2[0-(j-1)] can interleave to s3[0-(i+j-1)]. we have formula:

d[i][j] = d[i-1][j] && s3[i+j-1]==s1[i-1]    ||   d[i][j-1] && s3[i+j-1]==s2[j-1].

Solution:

 1 public class Solution {
 2     public boolean isInterleave(String s1, String s2, String s3) {
 3         int len1 = s1.length();
 4         int len2 = s2.length();
 5         
 6         //NOTE: need to consider this boundary case!
 7         if (s3.length()!=len1+len2) return false;
 8         
 9         boolean[][] d = new boolean[len1+1][len2+1];
10         d[0][0]=true;
11         for (int i=1;i<=len2;i++)
12             if (d[0][i-1] && s2.charAt(i-1)==s3.charAt(i-1))
13                 d[0][i]=true;
14             else d[0][i]=false;
15 
16         for (int i=1;i<=len1;i++)
17             if (d[i-1][0] && s1.charAt(i-1)==s3.charAt(i-1))
18                 d[i][0]=true;
19             else d[i][0]=false;
20 
21         for (int i=1;i<=len1;i++)
22             for (int j=1;j<=len2;j++)
23                 if (d[i-1][j] && s1.charAt(i-1)==s3.charAt(i+j-1))
24                     d[i][j]=true;
25                 else if (d[i][j-1] && s2.charAt(j-1)==s3.charAt(i+j-1))
26                     d[i][j]=true;
27                 else d[i][j]=false;
28 
29 
30         return d[len1][len2];        
31     }
32 }

 

相關文章