用 java语言以测试驱动开发实现KMP算法
时间: 2024-05-25 22:05:29 浏览: 17
下面是用 Java 语言以测试驱动开发实现 KMP 算法的示例代码:
1. 首先,我们需要创建一个 KMP 类,并定义一个名为 kmp 的公共方法,该方法将接收两个字符串作为参数,即文本字符串和模式字符串。该方法将返回一个整数,表示模式字符串在文本字符串中的起始位置,如果模式字符串不存在于文本字符串中,则返回 -1。
public class KMP {
public static int kmp(String text, String pattern) {
// TODO: 实现 KMP 算法
return -1;
}
}
2. 接下来,我们需要编写测试用例来验证我们的 kmp 方法是否正确。我们可以使用 JUnit 框架编写测试用例。首先,我们需要导入 JUnit 框架和断言库,然后编写一个名为 testKmp 的测试方法,该方法将调用 kmp 方法,并使用断言库验证 kmp 方法是否返回了正确的结果。
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class KMPTest {
@Test
public void testKmp() {
String text = "ABABDABACDABABCABAB";
String pattern = "ABABCABAB";
int expected = 10;
int actual = KMP.kmp(text, pattern);
assertEquals(expected, actual);
}
}
3. 然后,我们需要实现 kmp 方法。在 KMP 类中,我们可以定义一个名为 getNext 的私有方法,该方法将根据模式字符串计算出每个字符对应的 next 数组。然后,在 kmp 方法中,我们将使用 getNext 方法来在文本字符串中查找模式字符串。
public class KMP {
private static int[] getNext(String pattern) {
int[] next = new int[pattern.length()];
int i = 0, j = -1;
next[0] = -1;
while (i < pattern.length() - 1) {
if (j == -1 || pattern.charAt(i) == pattern.charAt(j)) {
i++;
j++;
next[i] = j;
} else {
j = next[j];
}
}
return next;
}
public static int kmp(String text, String pattern) {
int[] next = getNext(pattern);
int i = 0, j = 0;
while (i < text.length() && j < pattern.length()) {
if (j == -1 || text.charAt(i) == pattern.charAt(j)) {
i++;
j++;
} else {
j = next[j];
}
}
if (j == pattern.length()) {
return i - j;
} else {
return -1;
}
}
}
4. 最后,我们可以运行测试用例来验证 kmp 方法是否正确。如果测试通过,则表示我们已经成功实现了 KMP 算法。
运行结果:
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.003 sec
参考资料:
1. KMP算法 - 维基百科,自由的百科全书
2. JUnit - Java 编程语言
3. AssertJ - Fluent assertions for Java