在求职面试中,你要写一个算法来检查给定的字符串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;
}
答案 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];
}