// 判断一个字符串b,是否是字符串a的子串
public static int kmp(String a, String b) {
int na = a.length();
int nb = b.length();
char[] cha = a.toCharArray();
char[] chb = b.toCharArray();
int p1 = 0;
int p2 = 0;
int[] nextArr = getNextArr(chb);
while (p1 < na && p2 < nb){
if (cha[p1] == chb[p2]){
p1 ++;
p2 ++;
}else if (nextArr[p2] != -1){
p2 = nextArr[p2];
}else {
p1 ++;
}
}
return p2 == nb ? p1 - p2 : -1;
}
// 获取i位置之前的前缀与后缀相等的最大长度
public static int[] getNextArr(char[] ch) {
int n = ch.length;
int[] next = new int[n];
next[0] = -1;
next[1] = 0;
int i = 2;
int cn = 0;
while (i < n) {
if (ch[i - 1] == ch[cn]) {
next[i++] = ++cn;
} else if (cn > 0) {
// 例如:abab c abab a ,因为cn在c的位置,c!=a,所以 cn = next[cn], cn = 2,那么cn在第二个a的位置,和a比较,相等,next[i] = 3
cn = next[cn];
} else {
next[i++] = 0;
}
}
return next;
}
KMP算法
最新推荐文章于 2024-08-08 15:12:59 发布