Java codewars的合并字符串检查器
在一次求职面试中,你被要求编写一个算法来检查给定的字符串s是否可以由另外两个字符串part1和part2组成 限制是第1部分和第2部分中的字符顺序与s中的相同 面试官给你举了下面的例子,并告诉你从给定的测试用例中找出剩下的部分 例如: “codewars”是“cdw”和“oears”的合并: 见: 这是我的java代码,但无法通过所有测试。对不起,哪里错了?谢谢Java codewars的合并字符串检查器,java,string,algorithm,Java,String,Algorithm,在一次求职面试中,你被要求编写一个算法来检查给定的字符串s是否可以由另外两个字符串part1和part2组成 限制是第1部分和第2部分中的字符顺序与s中的相同 面试官给你举了下面的例子,并告诉你从给定的测试用例中找出剩下的部分 例如: “codewars”是“cdw”和“oears”的合并: 见: 这是我的java代码,但无法通过所有测试。对不起,哪里错了?谢谢 public static boolean isMerge(String s, String part1, String part2)
public static boolean isMerge(String s, String part1, String part2) {
s = s.replace(" ","");
part1 = part1.replace(" ","");
part2 = part2.replace(" ","");
int index1 = 0;
int index2 = 0;
char[] cp1 = part1.toCharArray();
char[] cp2 = part2.toCharArray();
for (int i = 0; i < s.length(); ) {
char is = s.charAt(i);
if (index1 < cp1.length && cp1[index1] == is) {
index1++;
i++;
continue;
}
if (index2 < cp2.length && cp2[index2] == is) {
index2++;
i++;
continue;
}
return false;
}
return s.length() == index1 + index2;
}
publicstaticbooleanismerge(字符串s,字符串part1,字符串part2){
s=s。替换(“,”);
第1部分=第1部分。替换(“,”);
第2部分=第2部分。替换(“,”);
int index1=0;
int index2=0;
char[]cp1=part1.toCharArray();
char[]cp2=part2.toCharArray();
对于(int i=0;i
问题在于,例如,如果您有:
S=CDWZZCDW
第1部分=cdw
第2部分=cdwzzz
首先,您尝试将整个part1与S开头匹配,而part将无法匹配字符串的其余部分。但是,如果您先考虑了第2部分,它将被正确地完成
所以,底线是你应该考虑所有的可能性。我认为动态编程方法是可行的。以下是C++中的伪代码:
bool rec(idx1, idx2, idxS ){
if(idx1 == part1.length && idx2 == part2.length){
if(idxS == S.length) return true; //everything matched
return false; //S has remaining
}
if(idxS == S.length){ //length part1 + part2 is more than S
return false;
}
if(mark[idx1][idx2][idxS] == true) //computed before
return dp[idx1][idx2][idxS];
mark[idx1][idx2][idxS] = true;
dp[idx1][idx2][idxS] = false;
if(idx1 < part1.length && part1[idx1] == S[idxS]){
if(rec(idx1 + 1, idx2, idxS + 1) == true) {
dp[idx1][idx2][idxS] = true;
}
}
if(idx2 < part2.length && part2[idx2] == S[idxS]){
if(rec(idx1, idx2 + 1, idxS + 1) == true){
dp[idx1][idx2][idxS] = true;
}
}
return dp[idx1][idx2][idxS];
}
bool rec(idx1、idx2、idxS){
if(idx1==part1.length&&idx2==part2.length){
如果(idxS==S.length)返回true;//所有匹配项
return false;//S有剩余
}
如果(idxS==S.length){//length part1+part2大于S
返回false;
}
如果(标记[idx1][idx2][idxS]==true)//在之前计算
返回dp[idx1][idx2][idxS];
标记[idx1][idx2][idxS]=true;
dp[idx1][idx2][idxS]=假;
if(idx1 当你用调试器跨过你的代码时,你发现了什么?考虑<代码>返回错误的代码>代码>。