![](/img/trans.png)
[英]Given two Strings, determine if 1 is a substring of the other recursively
[英]Given two strings, determine if they share a common substring
这是我在这里的第一个问题,我需要知道为什么以下代码没有通过 Hacker rank-> Algorithms-> Strings-> Two Strings 中的示例测试用例 2:问题在这里: https://www.hackerrank.com /挑战/两个字符串/问题
public static String twoStrings(String s1, String s2) {
String answer = "";
String StringToIterate = "";
String theOtherString = "";
if (s1.length() > s2.length()) {
StringToIterate = s2;
theOtherString = s1;
} else if (s1.length() < s2.length()){
StringToIterate = s1;
theOtherString = s2;
} else {
StringToIterate = s1;
theOtherString = s2;
}
for (int i= 0; i < StringToIterate.length();i++) {
String subS = StringToIterate.substring(i);
if (theOtherString.contains(subS)) {
answer = "YES";
} else {
answer = "NO";
}
}
return answer;
}
}
示例测试用例 2:
2
aardvark
apple
beetroot
sandals
我的代码给出:No No 但预期的 output 是:Yes No
为了让这个示例案例正常工作,我建议替换answer = "YES";
return "YES";
.
只需要一个匹配的 substring。 因此,您应该在找到匹配项后停止搜索。 即使您已经找到匹配项,您的代码也会愉快地继续搜索其他子字符串,从而将answer
设置回NO
。
我不知道确切的分配是什么,但似乎您还必须查看内部子字符串。 您的代码仅查看StringToIterate
的前 i 个字母。
我尝试使用您的示例案例来解释它:您的代码将 substring 检查这些字符串
a
ap
app
appl
apple
然而, p
或le
也可能是土豚的子串。 尝试更改您的代码以检查这些子字符串。
我希望这是足够的信息来继续编码并祝你的作业好运!
通过执行给出的建议(添加中断;在“YES”之后并使用 substring(i,i+1))通过了初始测试用例,但是,当我提交以下代码时,出现“超出时间限制”问题。
public static String twoStrings(String s1, String s2) {
String answer = "";
String StringToIterate = "";
String theOtherString = "";
if (s1.length() > s2.length()) {
StringToIterate = s2;
theOtherString = s1;
} else if (s1.length() < s2.length()){
StringToIterate = s1;
theOtherString = s2;
} else {
StringToIterate = s1;
theOtherString = s2;
}
for (int i= 0; i < StringToIterate.length();i++) {
String subS = StringToIterate.substring(i,i+1);
if (theOtherString.contains(subS)) {
answer = "YES";
break;
} else {
answer = "NO";
}
}
return answer;
}
}
我不能在 for 循环/if 语句中添加 return,因为编译器当然希望在方法体中但在 for 循环之外返回。 那么,有什么建议吗?
我假设其中一个测试用例使用了一个相当大的字符串,其中包含很多重复的字母。 您可以尝试编辑您的解决方案以跟踪您已经检查过的子字符串。 例如:
public static String twoStrings(String s1, String s2) {
String answer = "";
String StringToIterate = "";
String theOtherString = "";
List<String> checked = new ArrayList<>();
if (s1.length() > s2.length()) {
StringToIterate = s2;
theOtherString = s1;
} else if (s1.length() < s2.length()){
StringToIterate = s1;
theOtherString = s2;
} else {
StringToIterate = s1;
theOtherString = s2;
}
for (int i= 0; i < StringToIterate.length();i++) {
String subS = StringToIterate.substring(i,i+1);
if (checked.contains(subS)) {
continue;
}
if (theOtherString.contains(subS)) {
answer = "YES";
break;
} else {
checked.add(subS);
answer = "NO";
}
}
return answer;
}
使用checked
的列表运行 function 不会超出时间限制。
但这让我想到“Stream 可以完成所有这些”,这让我以完全不同的方式解决了这个问题:
public static String twoStrings(String s1, String s2) {
return s1.chars()
.distinct()
.mapToObj(c -> String.valueOf((char)c))
.anyMatch(s2::contains) ? "YES" : "NO";
}
如果没有.distinct()
步骤,我也会在测试 4 和 5 上超时,但是所有测试都很快通过。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.