如何制作“isSubstring(str1,str2)”的递归布尔方法

时间:2012-11-01 16:08:46

标签: java string recursion substring

if (isSubstring(str1, str2))
System.out.println(str1 + " is a substring of " + str2 + ".")

以下是isSubstring的方法:

public static boolean isSubstring(String str, String target)
    {   
        if (str == target)
            return true;

        return (isSubstring(str, target.substring(0,5)));            
    }

这就是我现在的代码,我无法理解你将如何解决这个问题。我的导师要求我们使用递归,所以返回必须调用自己。通常,这个问题很容易只用一行代码完成:

public static boolean isSubstring(String str, String target)
{
return str.contains(target)
}

但我必须毫无意义地使用递归来解决这个问题,而且知道这种方法有多么微不足道以及我的教师如何过于复杂地强迫我们这样做是非常令人沮丧的。我真的不知道从哪里开始,因为“return str.contains(target)”并没有给我一个很好的基础,我可以尝试解决这个问题。

5 个答案:

答案 0 :(得分:1)

一些事情:

首先,您有正确的想法,但是您想要搜索比您当前字符串小一个尺寸的'下一个'字符串。因此,如果您正在查看字符串Hamburger,那么您将搜索第二个amburger,然后搜索mburger。因此,当您再次出现时,您可能会尝试类似return isSubstring(str,target.substring(1))的内容。现在您似乎使用数字5来获取前5个字符。这很奇怪,因为你第一次这样做,(Hamburger到Hambu)你将永远无法再这样做。如果你的原始目标是“火腿”,那么你立即炸弹!不太好。

其次,测试它是否相等是不够的。使用汉堡包的例子,如果你正在寻找冲动,你会找到催促者,然后再去正确。你永远不会有冲动。因此,不是测试等于,而是使用beginsWith()进行测试。 (如果你从后面缩小它,比如汉堡到汉堡到汉堡,那你就用endsWith()。)

最后,如果你没有达到目标,你就没有好的办法。如果您有xyzzy目标,并且您正在搜索bob,则无法找到它。所以你需要一个“基础案例”,我建议将其用作第一行。有些东西说“如果令牌不可能在目标中,那么让我们马上回复”。

这很难,令人沮丧,而且似乎毫无意义。但请记住,他并不是想教你搜索字符串。这很傻,你知道如何搜索字符串!他试图教你递归,这不容易“得到”。

答案 1 :(得分:0)

一个修复方法是:在比较字符串/对象时使用equals()而不是====比较引用相等性。 equals()比较内容平等。

if (str == target)

应该是

if (str.equals(target))

答案 2 :(得分:0)

将字符串与equals()方法进行比较:更改

if (str == target)

if (str.equals(target))

答案 3 :(得分:0)

好的,我明白了,Asad的建议很有用。这是isSubstring的一种工作方法:

public static boolean isSubstring(String str, String target)
{   
    if (target.length() == 0)
        return false;

    if (str.equals(target))
        return true;

    else     
    return (isSubstring(str, target.substring(0,target.length()-1)));            
}

我不确定第二个“if”是否应该是“else if”。

答案 4 :(得分:0)

您知道该函数适用于:

  • 基础案例)空字符串,必须返回false;
  • 基本情况)以您要查找的字符串开头的字符串必须返回true;
  • rec case)否则删除第一个字符并检查字符串的其余部分。

这里是Java中的代码:

public static boolean isSubstring(final String str1, final String str2) {
    if ((str1 == null) || (str2 == null) || str1.isEmpty()) {
        return false;
    } else if (str1.startsWith(str2)) {
        return true;
    } else {
        return isSubstring(str1.substring(1), str2);
    }
}

测试:

public static void main(final String[] args) {
    System.out.println(isSubstring("hello this is a simple test", "is a"));
}

输出:

true