1
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)”并没有给我一个很好的基础来尝试解决这个问题。

4

5 回答 5

1

几件事:

首先,您的想法是正确的,但是您想让您搜索的“下一个”字符串比当前字符串小一个大小。因此,如果您在字符串 Hamburger 中查找,您会先搜索 amburger,然后再搜索 mburger。因此,当您重复出现时,您可能会尝试像return isSubstring(str,target.substring(1))现在您似乎使用数字 5 来获取前 5 个字符。这很奇怪,因为你第一次这样做时,(从汉堡到汉堡)你将永远无法再这样做。如果您最初的目标是“火腿”,那么您会立即轰​​炸!不太好。

其次,仅测试是否相等是不够的。以汉堡包为例,如果您正在寻找 urge,您会找到 urger,然后直接找到 rger。你永远不会有冲动。因此,不要测试equals,而是测试with beginsWith()。(如果你从后面缩小它,比如 Hamburger 到 Hamburge 到 Hamburg,那么你会使用endsWith().)

最后,如果你没有达到目标,你没有一个好的路径来做什么。如果您有xyzzy一个目标,并且您正在搜索bob,您将找不到它。因此,您需要一个“基本案例”,我建议将其用作第一行。上面写着“如果令牌不可能在目标中,那么让我们立即返回 false”。

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

于 2012-11-01T16:12:54.833 回答
0

一种解决方法是:在比较字符串/对象时使用equals()而不是。比较引用相等性。比较内容是否相等。====equals()

if (str == target)

应该

if (str.equals(target))
于 2012-11-01T16:10:08.343 回答
0

用方法比较字符串equals():change

if (str == target)

if (str.equals(target))
于 2012-11-01T16:10:28.553 回答
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
于 2013-12-11T12:06:41.920 回答
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”。

于 2012-11-01T16:28:04.520 回答