对于三个字符串A,B,C。我们称C由A和B交错组成当且仅当C包含且仅包含A,B中所有字符,且对应的顺序不改变。请编写一个高效算法,判断C串是否由A和B交错组成。
给定三个字符串A,B和C,及他们的长度。请返回一个bool值,代表C是否由A和B交错组成。保证三个串的长度均小于等于100。
测试样例:
"ABC",3,"12C",3,"A12BCC",6
返回:true
解析:
strA=“ABC”
strB=“12C”
aim=“A12BCC”
strA[0,i…lenA]
strB[0,j…lenB]
aim[0,i+j-1….lenA+lenB-1]
使用动态规划的方法
方便理解我们添加空字符
dp[i][j]表示strA[0~i]与strB[0~j]能否组成aim[0,i+j-1] 能=true 否=false
dp表
aim的最后一个字符肯定是由strA的最后一个字符或者strB的最后一个字符提供的。
因此可以理解为
dp[i][j] = dp[i-1][j]&&strA[i]==aim[i+j] 或则 dp[i][j-1]&&strB[j]==aim[i+j];
代码:
public boolean chkMixture(String A, int n, String B, int m, String C, int v) {
StringBuilder stringA = new StringBuilder(A);
StringBuilder stringB = new StringBuilder(B);
StringBuilder stringC = new StringBuilder(C);
Boolean[] dp = new Boolean[m+1];
dp[0] = true;
for (int i = 1; i < m+1; i++) {//初始化第一行
if (stringB.charAt(i-1)==stringC.charAt(i-1)){
dp[i] = true;
}else{
dp[i] = false;
}
}
for (int i = 0; i < n; i++) {
for (int j = 1; j < m+1; j++) {
dp[j] = (dp[j]&&stringA.charAt(i)==stringC.charAt(i+j))||(dp[j-1]&&stringB.charAt(j-1)==stringC.charAt(i+j));
}
}
return dp[m];
}
题目来源:http://www.nowcoder.com/practice/0ed4ac79ab264c6f9b58fc9ba6188793?rp=3&ru=/activity/oj&qru=/ta/2016test/question-ranking