以下是我尝试做的伪代码:
procedure naive(T, P):
result = { }
for s = 0 to n – m
match = true
for j = 0 to m – 1
if T[s+j] ≠ P[j]
match = false
if match
result = result + {s}
这是我写的:
public class naivepatternmatcher {
public static Integer[] main(char[] T, char[] P) {
Integer[] results = {};
int count = 0;
boolean match;
for (int s = 0; s <= (T.length - P.length); s++) {
match = true;
for (int j = 0; j <= P.length - 1; j++) {
if (T[s + j] != P[j]) {
match = false;
}
}
if (match == true) {
results[count] = s;
count++;
}
}
return results;
}
}
当我尝试运行我的Junit测试类时,我得到一个ArrayIndexOutOfBoundsException:0 at&#34; results [count] = s;&#34;在我的主要和&#34; Integer [] results = naivepatternmatcher.main(Sequence,Pattern1);&#34;在我的Junit测试中。
public class naivepatternmatcherTest {
private static final char[] Sequence = new char[] { 'a', 'b', 'a', 'a', 'a',
'b', 'a', 'c', 'c', 'c', 'a', 'a', 'b', 'b', 'a', 'c', 'c', 'a', 'a',
'b', 'a', 'b', 'a', 'c', 'a', 'a', 'b', 'a', 'b', 'a', 'a', 'c' };
@Test
public void test() {
char[] Pattern1 = new char[] { 'a', 'a', 'b' };
Integer[] ShouldEqual = new Integer[] { 3, 10, 17, 24 };
Integer[] results = naivepatternmatcher.main(Sequence, Pattern1);
assertArrayEquals(ShouldEqual, results);
}
}
任何人都可以解决这个问题并解释我缺少的东西吗?
答案 0 :(得分:1)
您的results
是一个空数组,其大小固定为0,结果[count] = s不会将数组的大小增加1,并将s
的值附加到其中。最好使用ArrayList
来获得这种动态增长的结果。
另一个建议是,如果因为break
T[s + j] != P[j]
没有必要进一步搜索模式的其余部分,则在内部for循环的末尾添加对if (T[s + j] != P[j]) {
match = false;
break
}
的调用。
Integer[]
请参阅以下代码,以获取实现示例,该示例可使您的返回类型保持ArrayList
,并且仅在内部使用public static Integer[] main(char[] T, char[] P) {
List<Integer> results = new ArrayList<>();
boolean match;
for (int s = 0; s <= (T.length - P.length); s++) {
match = true;
for (int j = 0; j <= P.length - 1; j++) {
if (T[s + j] != P[j]) {
match = false;
break;
}
}
if (match == true) {
results.add(s);
}
}
return results.toArray(new Integer[results.size()]);
}
。
{{1}}