Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java codewars的合并字符串检查器_Java_String_Algorithm - Fatal编程技术网

Java codewars的合并字符串检查器

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)

在一次求职面试中,你被要求编写一个算法来检查给定的字符串s是否可以由另外两个字符串part1和part2组成

限制是第1部分和第2部分中的字符顺序与s中的相同

面试官给你举了下面的例子,并告诉你从给定的测试用例中找出剩下的部分

例如:

“codewars”是“cdw”和“oears”的合并:

见:

这是我的java代码,但无法通过所有测试。对不起,哪里错了?谢谢

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当你用调试器跨过你的代码时,你发现了什么?考虑<代码>返回错误的代码>代码>。