我基本上必须创建一个程序,它返回字符串“code”出现在给定字符串中的任何位置的次数,除了我们接受任何字母“d”,所以“cope”和“cooe”计算我的APCS类,除了for循环的参数,特别是i<str.length()-3
之外,我对代码没有任何问题。它工作正常,但只是在我从长度中任意减去随机数之后。我真的想知道它和其他代码之间的相关性是什么,所以它不仅仅是猜测和检查我的事情。我不想养成这样做的习惯。
public int countCode(String str) {
int times = 0;
for(int i =0;i<str.length()-3;i++){
if(str.substring(i,i+2).equals("co") && str.substring(i+3,i+4).equals("e"))
times++;
}
return times;
}
答案 0 :(得分:3)
相关性是子字符串必须适合源字符串。您正在呼叫str.substring(i, i+2)
。现在让我们说你的字符串是5个字符长。这意味着字符串中的第一个索引是0,最后一个索引是4.现在假设i
等于3。
当您致电substring(i, i+2)
时,您实际上正在呼叫substring(3, 5)
。 substring
方法采用起始索引和结束索引。你的结束索引结果是5,这是非法的,因为它在最后一个索引为4的字符串之外。
因此,您应该真正检查i < str.length() - searchString.length() + 1
而不是i < str.length() - 3
。
答案 1 :(得分:2)
您的搜索模式长度为4个字符。字符串的最后一个字符位于索引.length() - 1
。因此,模式可以开始的最后一个索引是.length() - 4
之前的3个字符。您使用的值少于.length - 3
。所以循环的最后一次迭代就是这个值。这是对的。
在这样的情况下,一个小草图可以提供帮助:
| 0 | 1 | 2 | 3 | Pattern
... | L-5 | L-4 | L-3 | L-2 | L-1 | String (L==str.length)
... < L-3 ...| Iterations
答案 2 :(得分:1)
这实际上是一个正则表达式匹配。对于这种情况,使用String#substring
不必要地复杂化。更好的方法是使用Pattern#matcher
,如下所示:
public static int countCode(String s) {
Pattern codepattern = Pattern.compile("co.e");
Matcher codematcher = codepattern.matcher(s);
int count = 0;
while (codematcher.find()) count++;
return count;
}
如您所见,find()
将继续查找正则表达式,直到给定字符串结束。例如,给定String s = "This core supports all the code. Everyone comes to the core, for the cool stuff is all coded in here.";
,上述方法返回5
。
编辑:我意识到这并不是你所要求的,但我认为这可能对你有所帮助。
答案 3 :(得分:0)
Gene是现货,但请考虑这种基于正则表达式的替代方案:
int times = str.replaceAll("co[a-z]e", "xxxxx").length() - str.length();
这一切都在一行中完成,你让正则表达式引擎完成繁重的工作。