当前位置: 首页 > 知识库问答 >
问题:

递归等减法Java

吕翰飞
2023-03-14

我有以下问题:

编写一个递归静态方法isSubstring,签名如下-

public static boolean isSubstring(String s1,String s2)

获取两个字符串-s1、s2,如果s2是s1的子字符串,则返回true。

该方法应该是递归的,完全不使用迭代。也可以使用您编写的任何其他方法(如果您编写的话)。

正确的答案不会改变方法类型签名/注释(即使通过重载也不会)。

您只能在解决方案中使用以下方法:

公共字符字符(int i)

公共int长度()

公共字符串子字符串(int i)

这就是我目前所拥有的,我知道它不起作用isSubstring(“hello”,“ho”)将返回true。知道该怎么做吗?

public static boolean isSubstring(String s1, String s2) {
    if (s2.length() == 0)
        return true;
    if ((s1.length() == 0) || (s1.length() < s2.length()))
        return false;
    if (s1.charAt(0) != s2.charAt(0))
        return isSubstring(s1.substring(1), s2);
    else
        return isSubstring(s1.substring(1), s2.substring(1));
}

共有2个答案

钱浩荡
2023-03-14

您的解决方案几乎是好的,但您必须记住您做了一个替代。我提出以下解决方案(使用一个带有不同原型的helper函数,它符合问题的要求):

public static boolean sub(final String s1, final String s2, final boolean hasReplaced) {
    if (s2.length() == 0) {
        return true;
    }
    if ((s1.length() == 0) || (s1.length() < s2.length())) {
        return false;
    }
    if (s1.charAt(0) != s2.charAt(0)) {
        if (hasReplaced) {
            return false;
        }
        return sub(s1.substring(1), s2, hasReplaced);
    }
    return sub(s1.substring(1), s2.substring(1), true);
}

public static boolean isSubstring(final String s1, final String s2) {
    return sub(s1, s2, false);
}
江鹏飞
2023-03-14

我想这个应该可以。

它使用了一种辅助方法。当您看到第一个匹配时,它将调用辅助方法并验证子字符串是否从该点匹配。如果不是,它会在下一个匹配中尝试同样的方法。

public static boolean isSubstring(final String s1, final String s2) {
    if (s2.length() == 0) {
        return true;
    }

    if ((s1.length() == 0) || (s1.length() < s2.length())) {
        return false;
    }

    if (s1.charAt(0) != s2.charAt(0)) {
        return isSubstring(s1.substring(1), s2);
    }

    if (!isSubstringAux(s1.substring(1), s2.substring(1))) {
        return isSubstring(s1.substring(1), s2);
    }

    return true;
}

public static boolean isSubstringAux(final String s1, final String s2) {
    if (s2.length() == 0) {
        return true;
    }

    if (s1.charAt(0) == s2.charAt(0)) {
        return isSubstringAux(s1.substring(1), s2.substring(1));
    }

    return false;
}
 类似资料:
  • 我正在尝试对一个对象数组递归地运行一个reduce方法。 我从一个字符串开始,推送与该字符串匹配的对象,然后我看到条目。一旦我得到该对象,我就推送它,然后kepp递归地检查对象直到它达到最大(本例为3)。 但它不会超越第一个。 null null 期望的输出将是所有低于3并且在本例中管理的对象

  • 程序调用自身的编程技巧称为递归(recursion),它做为一种算法在程序设计语言中广泛应用。 Java 支持递归,在 Java 编程中,递归是允许方法调用自身调用的属性。调用自身的方法称为是递归的。 递归的典型例子是数字的阶乘。数字 N 的阶乘是 1 到 N 之间所有整数的乘积。例如 3 的阶乘就是 1×2×3。下面的程序使用递归来计算数字的阶乘。 该程序产生的输出如下所示: 3的阶乘是 6 4

  • 主要内容:递归的底层实现机制编程语言中,我们习惯将函数(方法)调用自身的过程称为 递归,调用自身的函数称为 递归函数,用递归方式解决问题的算法称为 递归算法。 函数(方法)调用自身的实现方式有 2 种,分别是: 1) 直接调用自身,例如: 2) 间接调用自身,例如: 程序中,function1() 函数内部调用了 function2() 函数,而 function2() 函数内部又调用了 function1() 函数。也就是

  • 我有两个非递归方法,其中一个读取字符串中的总“e”字符,另一个检查 ArrayList 是否按字母顺序排列。 递归方法的定义是方法调用自身。我相信我理解这个概念,但要实现它或将其转换为递归方法确实很困难。我怎样才能将这些方法转化为递归方法,同时我应该如何思考?此外,这是我的另一种方法,它只打印出指定数字大小的数字。 条件方法检查数字的第一个数字(从右起)是否大于第二个数字,并再次检查第二个是否大于

  • 首先,我应该说这是一个让我困惑的作业,我已经纠正了讲师的一个问题:/ 不管怎样,我已经做了一个方法,它使用布尔值、一个当循环和一个计数器来计算单词。 然而,我需要了解如何将其转化为一个递归方法,计算字符串中的单词数量,一个单词由一个或多个空格分隔。 正如您所看到的,唯一的参数是CountWords(String s,int i),使其更加困难。 此外,在该方法中,我仅限于使用这三种方法:s.cha

  • 我正在处理一个递归二分法/算法。我已经把我的递归放在else/else if语句中,不知道我是否错了。它也返回正确的根,而没有递归,但主要问题是用递归。