递归应该被认为是两个部分。
1) 基本情况。这是很容易确定的微不足道的情况。
到目前为止,您所拥有的是基本案例的良好开端。
1) 字符串是否小于 3?然后返回假。
2)字符串是否以“bab”开头然后返回true。
2) 递归情况。
这会将问题拆分为更小的问题,如果您将它们拆分得足够多,希望您有一个基本案例。
这是一个简单递归的好例子。
public static boolean substringRec(String str, String str2) {
if (str.length() < str2.length()) return false;
if (str.length() == str2.length())
{
if (equals(str, str2))
return true;
return false;
}
else
return substringRec(str.substring(1), str2);
}
public static boolean equals(String str1, String str2)
{
if (str1.charAt(0) == str2.charAt(0))
{
if (str1.length() == 1)
return true;
return equals(str1.substring(1), str2.substring(1));
}
return false;
}
这使用简单的基本情况,并作为递归情况检查从索引一开始的字符串。这仅将我们的字符串减少了一个章程,但足以解决问题。我必须实现一个 .equals ,因为显然你不能使用它,你可以用类似的方式来做。
这意味着我们最终得到了字符串长度的堆栈级别。
我们可以做得更好吗?稍微,通过将问题分成两半,我们只需要 ln(n) 的堆栈级别,其中 n 是字符串的长度。对于大多数长度来说,这并不是什么大问题,但如果您正在搜索长度为一百万的字符串,它可能很重要。在第一个版本中,我们的堆栈深度约为 1,000,000!但有了这个二进制版本,我们只需要深入 14 层即可。
虽然这是有代价的,但我们的解决方案涉及更多,并且会打破您在作业中的一些规则,但我认为这很有趣。
我们的基本案例
1) 如果字符串小于搜索字符串的长度,则返回 false。
2)如果字符串是搜索字符串的长度,如果相等则返回true,否则返回false。
3) 如果字符串出现在字符串的中点之上,则返回 true。
如果这些都不正确,我们将字符串分成两部分并递归检查该字符串。
这是该算法的一个示例,尽管它尚未经过全面测试,但我很确定它会没问题。
public static boolean substringRec2(String str, String searchString) {
// 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(substringRec2(str.substring(0,halfWay -1), searchString))
return true;
if(substringRec2(str.substring(halfWay, str.length()), searchString))
return true;
return false;
}
注意 - 取自我之前的一个答案并修改 - https://stackoverflow.com/a/21594554/3096507