题目
题目分析
KMP算法
首先是生成next数组
然后就是匹配,已经写过很多次了,写几个需要注意的点
1,next数组,初始化next[0]=-1,next[1]=0,我们从2开始遍历
三种情况的判断
if(match[cur-1]==match[pre])
{
next[cur++]=++pre;//pre之前的字符算上当前的字符
//next[cur++]=(pre-0)+1; pre++;
}
else if(pre!=0)
{
pre=next[pre];
}
else
{
next[cur++]=0;
}2,正式匹配的时候,判断条件
if()//匹配的话,一直向前走
{
}else if()//match的还不是空的话
{
matchi=next[matchi];
}else//match都是空的话
{
stri++;
}代码展示
public static int match(String str,String match)
{
int stri=0;
int matchi=0;
int[] nextArr=getNextArr(match);
while(stri!=str.length()&&matchi!=match.length())
{
if(str.charAt(stri)==match.charAt(matchi))
{
stri++;
matchi++;
}else if(nextArr[matchi]>=0)
{
matchi=nextArr[matchi];
}
else
{
stri++;
}
}
return matchi==match.length()?stri-matchi:-1;
}
/*
生成next数组
*/
public static int[] getNextArr(String match)
{
if(match.length()==1) return new int[]{-1};
int[] nextArr=new int[match.length()];
char[] chas=match.toCharArray();
nextArr[0]=-1;
nextArr[1]=0;
int cur=2;
int pre=0;
while(cur!=match.length())
{
if(chas[cur-1]==chas[pre])
{
nextArr[cur++]=++pre;
}else if(pre!=0)
{
pre=nextArr[pre];
}else
{
nextArr[cur++]=0;
}
}
return nextArr;
}学习情况
1次

京公网安备 11010502036488号