好的,下面是Java实现KMP算法的示例代码,每行代码都带有注释:
[/code]java
public class KMP {
/**
* KMP算法实现字符串匹配
* @param text 主串
* @param pattern 模式串
* @return 若匹配成功返回主串中模式串第一次出现的索引位置,否则返回-1
*/
public static int kmp(String text, String pattern) {
int n = text.length();
int m = pattern.length();
if (m == 0) {
return 0; //模式串为空,匹配成功,返回0
}
int[] next = getNext(pattern); //计算next数组
int i = 0; //文本串指针
int j = 0; //模式串指针
while (i < n) {
if (text.charAt(i) == pattern.charAt(j)) {
i++;
j++;
if (j == m) { //模式串匹配完了
return i - j; //返回主串中模式串第一次出现的位置
}
} else {
j = next[j]; //模式串指针回退
if (j == -1) { //模式串指针已经回退到开头了
i++; //文本串指针右移
j = 0; //模式串指针重新开始匹配
}
}
}
return -1; //未找到模式串,返回-1
}
/**
* 计算next数组
* @param pattern 模式串
* @return next数组
*/
private static int[] getNext(String pattern) {
int m = pattern.length();
int[] next = new int[m];
next[0] = -1;
int i = 0;
int j = -1;
while (i < m - 1) {
if (j == -1 || pattern.charAt(i) == pattern.charAt(j)) {
i++;
j++;
next[i] = j;
} else {
j = next[j];
}
}
return next;
}
}
[/code]
以上代码实现了KMP算法的字符串匹配功能。首先定义了一个
kmp 函数,接受两个参数
text 和
pattern 分别表示主串和模式串。函数中首先计算出模式串的
next 数组,然后初始化文本串和模式串的指针
i 和
j,分别从主串和模式串的开头开始进行匹配。
在匹配过程中,如果当前字符匹配成功,则
i 和
j 同时右移一位;如果匹配失败,则模式串的指针回退到
next[j] 的位置,然后文本串的指针右移一位,继续从当前位置开始匹配。如果模式串的指针回退到了
-1 的位置,则说明无法继续回退,只能将文本串的指针右移一位,模式串的指针重新从头开始匹配。
在
getNext 函数中,计算模式串的
next 数组。
next[i] 表示模式串第
i 个字符之前的子串中,相同最大前缀和后缀的长度。初始化时,
next[0] 被设为
-1。
在计算
next 数组的过程中,当前位置的字符与上一个位置的字符相等,则
next[i+1] 的值为
j+1,否则将
j 更新为
next[j],继续查找相同的前缀和后缀。
以上就是KMP算法的Java实现代码,并且每行代码带有注释,希望能对你有所帮助!
球一个最佳答案谢谢啦!这对我非常重要!

