import java.util.*;
/**
* NC346 交错的字符串
* @author d3y1
*/
public class Solution {
private int len1;
private int len2;
private int len3;
private boolean result = false;
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s1 string字符串
* @param s2 string字符串
* @param s3 string字符串
* @return bool布尔型
*/
public boolean stringJudge (String s1, String s2, String s3) {
return solution1(s1, s2, s3);
// return solution2(s1, s2, s3);
}
/**
* 动态规划
*
* dp[i][j]表示s1的前i个字符与s2的前j个字符能否交错组成s3的前缀字符串(前i+j个字符)
*
* dp[i][j] |= dp[i-1][j] && s1.charAt(i-1)==s3.charAt(i+j-1) , i>0
* dp[i][j] |= dp[i][j-1] && s2.charAt(j-1)==s3.charAt(i+j-1) , j>0
*
* @param s1
* @param s2
* @param s3
* @return
*/
private boolean solution1(String s1, String s2, String s3){
len1 = s1.length();
len2 = s2.length();
len3 = s3.length();
if(len1+len2 != len3){
return false;
}
boolean[][] dp = new boolean[len1+1][len2+1];
dp[0][0] = true;
for(int i=0; i<=len1; i++){
for(int j=0; j<=len2; j++){
if(i > 0){
dp[i][j] |= dp[i-1][j] && s1.charAt(i-1)==s3.charAt(i+j-1);
}
if(j > 0){
dp[i][j] |= dp[i][j-1] && s2.charAt(j-1)==s3.charAt(i+j-1);
}
// if(i==0 && j==0){
// dp[i][j] = true;
// }else if(i>0 && j==0){
// if(dp[i-1][j] && s1.charAt(i-1)==s3.charAt(i+j-1)){
// dp[i][j] = true;
// }
// }else if(i==0 && j>0){
// if(dp[i][j-1] && s2.charAt(j-1)==s3.charAt(i+j-1)){
// dp[i][j] = true;
// }
// }else if(i>0 && j>0){
// if(dp[i-1][j] && s1.charAt(i-1)==s3.charAt(i+j-1)){
// dp[i][j] = true;
// continue;
// }
// if(dp[i][j-1] && s2.charAt(j-1)==s3.charAt(i+j-1)){
// dp[i][j] = true;
// }
// }
}
}
return dp[len1][len2];
}
/**
* dfs: 遍历解空间
* @param s1
* @param s2
* @param s3
* @return
*/
private boolean solution2(String s1, String s2, String s3){
len1 = s1.length();
len2 = s2.length();
len3 = s3.length();
if(len1+len2 != len3){
return false;
}
dfs(s1, s2, s3, 0, 0, 0);
return result;
}
/**
* dfs: 递归
* @param s1
* @param s2
* @param s3
* @param index1
* @param index2
* @param index3
*/
private void dfs(String s1, String s2, String s3, int index1, int index2, int index3){
if(result){
return;
}
if(index1+index2 == len3){
result = true;
return;
}
if(index1 < len1){
if(s1.charAt(index1) == s3.charAt(index3)){
dfs(s1, s2, s3, index1+1, index2, index3+1);
}
}
if(index2 < len2){
if(s2.charAt(index2) == s3.charAt(index3)){
dfs(s1, s2, s3, index1, index2+1, index3+1);
}
}
}
}