在一个字符串中有多少次子字符串[Java]
问题描述:
我正在尝试编写一段代码以确定字符串s2中有多少次s1字符串。在一个字符串中有多少次子字符串[Java]
这是代码我已经写了,但不工作:
package lab2_1;
public class Main {
public static void main(String[] args) {
String s1 = "si";
String s2 = "sir1 si cu sir2 fac un sir3";
int count = 0;
int ok=1;
int i=1;
for(i=0;i<=s2.length()-1;i++)
if (s2.substring(i,i+s1.length()).equals(s1))
count++;
System.out.println(count);
}
}
你能不能请人检查我的代码,并告诉我什么是我的错?
答
问题是您在for
循环中使用了错误的结束条件。您尝试访问的s2
中的最高索引是i + s1.length()
,因此您需要确保始终为最多s2.length() - 1
。
您for
循环改成这样:
for(i = 0; i + s1.length() < s2.length(); i++)
,它会工作。
答
这是一个有点不同的方法,但它也应该工作。你只拆分字符串,并检查它的大小-1:
String s1 = "si";
String s2 = "sir1 si cu sir2 fac un sir3";
String[] split = s2.split(s1);
System.out.println("number of substrings: " + (split.length - 1));
答
我会算多少次String.indexOf
返回一个非负数:
int lastPos = -1;
int count = 0;
while (true) {
lastPos = s2.indexOf(s1, lastPos + 1);
if (lastPos < 0) break;
++count;
}
这比使用String.split
更有效(或String.substring
),因为它不构建任何其他对象。
对不起关于ok = 1和i = 1;我已经从代码中删除了它们。 –
代码审查与SO无关。对于审查,有[代码审查](http://codereview.stackexchange.com/)。如果你的代码不起作用,请描述你的输入,你的期望输出和你观察到的输出。 – Turing85
@ Turing85不推荐CR,这是无关紧要的话题。 – Tunaki