1
public static void main(String[] args)
    {
        String s = "Hello There";
        String p = "eo";
        int reps = 0;

        for (int i=0; i<s.length()-p.length(); i++) //checks all characters in the length of s.length minus the length it's searching for
        {

            for (int j=0; j<p.length(); j++)
            {
                if (s.charAt(i+j) == p.charAt(j)) 
                    reps++; 
            }


        }

        System.out.print(reps);

    }

它打印 3 表示 e 和 o 出现的次数,而它应该打印 4。我认为这是因为它在检查“re”后结束了搜索,这意味着它检查了“r”中的“e”, “e”代表“o​​”。这通常可以工作,但搜索到此结束,如果我尝试修复它,我会出现超出范围的错误。

4

3 回答 3

0

您没有循环整个第一个字符串。

for (int i=0; i<s.length()-p.length(); i++)

应该

for (int i=0; i<s.length(); i++)

..

String s = "Hello There";  //length is 11
String p = "eo"; // length is 2

如果你循环第一个字符串的所有字符没问题,但是你循环的是 s.length-p.length,那么你正在读取前 11-2 个字符(其中一个发现是最后一个,在位置长度-1)

if (s.charAt(i+j) == p.charAt(j)) 

那应该是

if (s.charAt(i) == p.charAt(j)) 

您想比较 s 中 p 的每个字符

如果您将“H”与“eo”进行比较,您希望将“H”与“e”进行比较,然后再与“o”进行比较,如果使用 i+j 会将“H”的指针移动到“e”,并且很快。

于 2013-10-01T01:07:19.420 回答
0

从改变开始

for (int i=0; i<s.length()-p.length(); i++)

for (int i = 0; i < s.length(); i++)

基本上,您的条件是说 whilei < 10 - 2这不是您想要做的。相反,你想检查每个字符s

接下来换...

if (s.charAt(i+j) == p.charAt(j)) 

if (s.charAt(i) == p.charAt(j)) {

否则,您将不会检查正确的字符,并且最终可能会出现数组越界异常......

如果i==0那么您循环将检查i( 0) 和i+j( 1) 处的字符,这并不是您真正想要的。您只想比较字符i

于 2013-10-01T01:08:45.733 回答
0

这将是正确的循环。

for (int i = 0; i < s.length(); i++)
{
    for (int j = 0; j < p.length(); j++)
    {
        if (s.charAt(i) == p.charAt(j)) {
            reps++; 
        }
    }
}

你得到一个超出范围的错误,因为你正在检查s.charAt(i+j)你应该检查的时间s.charAt(i)

于 2013-10-01T01:10:32.467 回答