【问题标题】:How Do You Make A Recursive Boolean Method Of "isSubstring(str1, str2)"如何创建“isSubstring(str1, str2)”的递归布尔方法
【发布时间】:2012-10-22 06:35:22
【问题描述】:
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)”并没有给我一个很好的基础来尝试解决这个问题。

【问题讨论】:

    标签: java string recursion substring


    【解决方案1】:

    几件事:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      if (str == target)
      

      应该是

      if (str.equals(target))
      

      【讨论】:

        【解决方案3】:

        好的,我明白了,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】:

          equals()方法比较字符串:改变

          if (str == target)
          

          if (str.equals(target))
          

          【讨论】:

          • 嘿,仅供参考,您的网站链接是会话的,因此它只会将点击它的人指向他们自己的linkedin个人资料 - 您想使用公共个人资料链接。
          【解决方案5】:

          你知道该函数应用于:

          • 基本情况)一个空字符串,必须返回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
          

          【讨论】:

            猜你喜欢
            • 2010-09-16
            • 2012-10-28
            • 2014-03-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-23
            • 2015-12-27
            • 1970-01-01
            相关资源
            最近更新 更多