给定三个字符串str1、str2和aim,如果aim中属于str1的字符之间保持原来在str1中的顺序,对于str2也是如此,那么称aim是str1和str2的交错组成。
eg:str1 = "AB" str2 = "12"。那么"AB12",“A1B2”,“A12B”,“1A2B”等都是str1与str2的交错组成。
public class Solution {
public static boolean isCross1(String str1, String str2, String aim){
// arm的长度是len(str1) + len(str2)
// 1.开辟状态数组 定义状态: dp[i][j]表示str1[0...i-1]与str2[0...j-1]能否构成arm[0...i+j-1]
boolean[][] dp = new boolean[str1.length() + 1][str2.length() + 1];
// 2. 初始条件
dp[0][0] = true; // 空串可以由两个空串交叉构成
char[] chs1 = str1.toCharArray();
char[] chs2 = str2.toCharArray();
char[] Caim = aim.toCharArray();
// 如果两者长度不相等则直接返回false
if (Caim.length != (chs1.length + chs2.length)){
return false;
}
// 前面多少个字符是相同的
for (int i = 1; i <= str1.length(); i++) {
if (chs1[i-1] != Caim[i-1]){
break;
}
dp[i][0] = true;
}
// 前面多少个字符是相同的
for (int j = 1; j <= chs2.length; j++) {
if (chs2[j-1] != Caim[j-1]){
break;
}
dp[0][j] = true;
}
// 3. 计算顺序// 转移方程
for (int i = 1; i <= chs1.length; i++) {
for (int j = 1; j <= chs2.length; j++){
if (dp[i - 1][j] && (chs1[i - 1] == Caim[i + j -1])){
dp[i][j] = true;
} else
dp[i][j] = dp[i][j - 1] && (chs2[j - 1] == Caim[i + j - 1]);
}
}
return dp[chs1.length][chs2.length];
}
public static void main(String[] args) {
String str1 = "AB";
String str2 = "12";
System.out.println(isCross1(str1, str2, "AB12"));
}
}
《IT名企--左程云》