代码战中合并的字符串检查器

时间:2016-07-07 15:22:54

标签: java string algorithm

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

限制是part1和part2中的字符与s中的字符顺序相同。

面试官给出了以下示例,并告诉您从给定的测试用例中找出其余部分。

例如:

'codewars'是来自'cdw'和'oears'的合并:

请参阅:https://www.codewars.com/kata/merged-string-checker/train/java

这是我的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;
}

1 个答案:

答案 0 :(得分:0)

问题是,例如,如果你有:

S = cdwzzzcdw

part1 = cdw

part2 = 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];
}