需要帮助查看字符串是否包含使用递归顺序排列的字符列表

时间:2019-04-23 19:44:42

标签: java recursion

我的老师给我分配了一个作业,其中有两个字符串,一个完整的单词和一个包含可能包含在完整单词中的字母的子字符串。目的是使用递归来查看完整单词是否按给定顺序包含子字符串的字母。以下是一些我正在谈论的例子:

-“ 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;
}

但不知道从那里去哪里。感谢您的帮助。

1 个答案:

答案 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));
  • 到目前为止,partialfull都是非空的,让我们利用StringindexOf实例方法。如果字符串中不存在该字符,则此方法将返回给定字符 -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)代表firstOccurrencepartial的第一个字符的第一个位置,因此我们不关心(可能)跳过的位置。
    • 例如,如果fullpartial = "mtr"full = "computer"在位置m上匹配,我们应该开始检查2partial = "tr"内的full = "puter"下一个递归调用。

希望这会有所帮助!