dp[i][j]的值代表aim[0...i+j-1]能否被str1[0...i-1]和str2[0...j-1]交错组成。
public static boolean crossString(String s1,String s2,String aim){
if((s1.length()+s2.length())!=aim.length() || s1==null || s2==null || aim==null)
return false;
int M=s1.length();
int N=s2.length();
char[] ch1=s1.toCharArray();
char[] ch2=s2.toCharArray();
char[] a=aim.toCharArray();
boolean[][] dp = new boolean[M+1][N+1];
dp[0][0]=true;
for(int i=1;i<=M;i++){
dp[i][0]=((ch1[i-1]==a[i-1]) && dp[i-1][0]);
}
for(int j=1;j<=N;j++){
dp[0][j]=((ch2[j-1]==a[j-1]) && dp[0][j-1]);
}
for(int i=1;i<=M;i++){
for(int j=1;j<=N;j++){
dp[i][j]=((ch1[i-1]==a[i+j-1]) && dp[i-1][j])||
((ch2[j-1]==a[i+j-1]) && dp[i][j-1]);
}
}
return dp[M][N];
}