我正在编写codebat作为我即将进行的测验的练习。我正在使用递归来做递归问题,但我的老师说我应该能够使用其他循环来完成它们。我认为我应该使用for循环,因为它们很容易实现相同的结果。
但我无法将递归转换为for循环。
这是问题所在:
Given a string and a non-empty substring sub, compute recursively the number of times that sub appears in the string, without the sub strings overlapping.
strCount("catcowcat", "cat") → 2
strCount("catcowcat", "cow") → 1
strCount("catcowcat", "dog") → 0
这是我尝试使用的代码:
public int strCount(String str, String sub) {
int number = 0;
for (int i = 0; i >= str.length() - 1; i++) {
if (str.substring(i, sub.length()).equals(sub)) {
number += 1;
}
}
return number;
}
当我返回时,一切都返回0。
答案 0 :(得分:1)
当您说
时,在lol1
循环中
for
永远不会输入循环,因为您正在测试i >= str.length() - 1
是否大于允许的长度(并且不是)。你需要像
i
或强>
i <= str.length() - 1
此外,i < str.length()
可以写为number += 1;
答案 1 :(得分:0)
您错过的一个细节是“没有子字符串重叠”。这个问题需要一个while循环,而不是for循环,因为索引将增加不同的数量,具体取决于是否匹配。
这是测试strCount方法是否正常工作的可执行代码。
package com.ggl.testing;
public class StringCount {
public static void main(String[] args) {
StringCount stringCount = new StringCount();
System.out.println(stringCount.strCount("catcowcat", "cat"));
System.out.println(stringCount.strCount("catcowcat", "cow"));
System.out.println(stringCount.strCount("catcowcat", "dog"));
}
public int strCount(String str, String sub) {
int count = 0;
int length = str.length() - sub.length();
int index = 0;
while (index <= length) {
int substringLength = index + sub.length();
if (str.substring(index, substringLength).equals(sub)) {
count++;
index += sub.length();
} else {
index++;
}
}
return count;
}
}