说明:
这里只是简单实现了一下KMP算法,是博主的一个笔记,具体原理就不说了,有点复杂,而且其他博主讲的更精,这里推荐b站上搜代码随想录卡尔,讲得很明白
/**
*
* @param target 目标串
* @param dest 模式串
* @return 模式串在目标串中出现的第一个的下标,若没有则返回-1
*/
public static int KMP(String target,String dest){
int[] next = new int[dest.length()];//存储最长相等前后缀
//这一步代表获取next值
for(int i = 1,j = 0;i<dest.length();i++){
while(j>0&&dest.charAt(i)!=dest.charAt(j))//前后缀不相同
j = next[j-1];
if(dest.charAt(i)==dest.charAt(j))//前后缀相同
j++;
next[i] = j;
}
//i表示目标串下标,j表示模式串下标
for(int i = 0,j=0;i<target.length();i++){
while(j>0&&target.charAt(i)!=dest.charAt(j))//无法匹配j根据next数组回退
j = next[j-1];
if(target.charAt(i)==dest.charAt(j))//相同则j++继续,同时进入下一轮循环
j++;
if(j == dest.length())//j匹配到末尾,说明匹配成功
return i-j+1;
}
return -1;//未找到返回-1
}