KMP求子串是否出现
char S[200], T[200];
int next[200] = {0};
void getnext() {
int i = 0,j = -1;
next[i] = -1;
while(i < strlen(T)){
if(j == - 1 || T[i] == T[j])
i ++,j ++, next[i] = j;
else
j = next[j];
}
}
int KMP() {
getnext();
int i = 0, j = 0, lenS = strlen(S), lenT = strlen(T);
while((i < lenS) && (j < lenT)) {
if(j == -1 || S[i] == T[j]){
j++;
i++;
}
else
j = next[j]; //j回溯
}
if(j == lenT)
return i - lenT;
else
return -1;
}
KMP求子串出现次数。
char S[200], T[200];
int next[200] = {0};
void getnext() {
int i = 0,j = -1;
next[i] = -1;
while(i < strlen(T)){
if(j == - 1 || T[i] == T[j])
i ++,j ++,next[i] = j;
else
j = next[j];
}
}
int KMP_count() {
int ans = 0;
getnext();
int i = 0, j = 0, lenS = strlen(S), lenT = strlen(T);
while(i < lenS) {
if(j == -1 || S[i] == T[j]){
j++;
i++;
}
else
j = next[j];
if(j == lenT){
ans ++;
j = next[j-1];
i --;
}
}
return ans;
}