包含“bab”的布尔函数

时间:2014-02-06 04:10:24

标签: java recursion

我怎么能有一个递归的布尔方法来检查它是否包含bab。我有这个,但我想递归地做。

public static boolean hasBAB(String str) {
      if (str.length() < 3) return false;
      if (str.substring(0,3).equals("bab"))
        return true;
      else
        return false;
    }

3 个答案:

答案 0 :(得分:5)

public static boolean hasBAB(String str) {
  if (str.length() < 3) return false;
  if (str.substring(0,3).equals("bab"))
    return true;
  else
    return hasBAB(str.substring(1));
}

但你真的应该使用String.contains

答案 1 :(得分:4)

无需递归;)您正在寻找String.contains

public static boolena hasBAB (String str) {
    if (String.length() < 3) return false;
    else return str.contains("bab");
}

答案 2 :(得分:2)

递归应该被认为是两个部分。

1)基础案例。这是一件很容易确定的简单案例。 到目前为止,您所拥有的基础案例是一个良好的开端。 1)字符串是否小于3?然后返回false。 2)字符串是否以“bab”开头然后返回true。

2)递归案例。 这将问题分解为更小的问题,如果你将它们分开,希望你有一个基本案例。

@Logiraptro有一个简单递归的好例子。

public static boolean hasBAB(String str) {
  if (str.length() < 3) return false;
  if (str.substring(0,3).equals("bab"))
    return true;
  else
    return hasBAB(str.substring(1));
}

这将使用您的基本案例,并且作为递归案例检查索引1中的字符串。这只能通过一个章程减少我们的字符串,但足以解决问题。

这意味着我们最终得到了字符串长度的堆栈级别。

我们可以做得更好吗?稍微,通过将问题分成两半,我们只需要堆栈级别ln(n),其中n是字符串的长度。对于大多数长度来说这不是什么大问题,但是如果你正在搜索长度为一百万的字符串,那么它可能很重要。对于第一个版本,我们的堆栈将大约为1,000,000深!但是使用这个二进制版本我们只需要大约14级。

这需要付出代价,我们的解决方案因为更多参与。

我们的基础案例 1)如果字符串小于搜索字符串的长度,则返回false。 2)如果字符串是搜索字符串的长度,如果它们相等则返回true,否则返回false。 3)如果字符串出现在字符串的中点之上,则返回true。

如果这些都不成立,我们将字符串分成两部分并递归检查该字符串。

以下是该算法的一个示例,您可以将“bab”替换为您喜欢的任何字符串,虽然它尚未经过全面测试,我很确定它会没问题。

public static boolean hasBAB(String str) {
      String searchString = "bab";

      // Base cases
      if (str.length() < searchString.length()) 
          return false;

      if (str.length() == searchString.length())
      {
          if (str.equals(searchString))
          {
              return true;
          }
          return false;
      }

      int halfWay = str.length()/2;

      // Now check for the search string over the "break"
      for (int i = 0; i < searchString.length(); i++)
      {
          int startIndex = halfWay - 1 - i;
          int endIndex = startIndex + 3;
          if (startIndex >= 0)
          {
              String substring = str.substring(startIndex, endIndex);
              if (substring.equals(searchString))
              {
                  return true;
              }
          }
      }

     // Recursive Cases 
     //  We did find the search string over the break,so break the string into two equal(ish) pieces and check those 
     if(hasBAB(str.substring(0,halfWay -1)))
         return true;

     if(hasBAB(str.substring(halfWay, str.length())))
         return true;

     return false;
}