我的老师给我分配了一个作业,其中有两个字符串,一个完整的单词和一个包含可能包含在完整单词中的字母的子字符串。目的是使用递归来查看完整单词是否按给定顺序包含子字符串的字母。以下是一些我正在谈论的例子:
-“ xd”,“ test”返回false,因为完整单词中不存在一个或多个子字符串字母。
-“ ts”,“ test”返回true,因为在整个单词中都找到了两个字母。
-“ trl”,“ turtle”返回true,因为所有字母都在完整单词中找到并且以正确的顺序找到。
-“ tlr”,“ turtle”返回false,因为尽管所有字母都存在于完整单词中,但未按子字符串的顺序找到它们。
我尝试过:
public boolean contains_recursive(String partial, String full) {
String[] partialArray = partial.split("");
if(full.contains(partialArray[0])) {
partialArray = Arrays.copyOfRange(partialArray, 1, partialArray.length);
String newPartial = "";
for(String character : partialArray) {
System.out.println(character);
newPartial += character;
}
contains_recursive(newPartial, full);
}
return false;
}
但不知道从那里去哪里。感谢您的帮助。
答案 0 :(得分:0)
尝试一下:
public boolean containsRecursive(String partial, String full) {
if (partial.isEmpty()) return true;
if (full.isEmpty()) return false;
int firstOccurrence = full.indexOf(partial.charAt(0));
return firstOccurrence >= 0 && containsRecursive(partial.substring(1), full.substring(firstOccurrence + 1));
}
说明:
if (partial.isEmpty()) return true;
if (full.isEmpty()) return false;
full
字符串中没有要比较的字符,因此partial
字符串肯定不在full
中,返回false
。int firstOccurrence = full.indexOf(partial.charAt(0));
partial
和full
都是非空的,让我们利用String
的indexOf
实例方法。如果字符串中不存在该字符,则此方法将返回给定字符或 -1
首次出现的位置。partial.charAt(0)
是因为如果partial
中不存在full
的第一个字符,那为什么还要检查partial
中的其余字符呢?换句话说,在检查其余字符之前,请确保第一个字符存在。return firstOccurrence >= 0 && containsRecursive(partial.substring(1), full.substring(firstOccurrence + 1));
firstOccurrence >= 0
是因为如果firstOccurrence
是-1
,则意味着partial
的第一个字符不在full
中,因此应返回{{ 1}}。false
用于短路。换句话说,如果&&
为firstOccurrence >= 0
,则布尔值检查的后半部分(即递归调用)将不会被评估,因为false
。false && anyOtherBooleanExpression ==> false
的第一个字符在partial
中时,我们才能实现这一点。现在,我们通过将full
减去的所有字符作为其第一个字符或 partial
来再次调用函数。 partial.substring(1)
代表firstOccurrence
中partial
的第一个字符的第一个位置,因此我们不关心(可能)跳过的位置。
full
和partial = "mtr"
,full = "computer"
在位置m
上匹配,我们应该开始检查2
中partial = "tr"
内的full = "puter"
下一个递归调用。希望这会有所帮助!