#include <string.h>
#include<stdio.h>
/*
BBC ABCDAB ABCDABCDABDE
搜索词"ABCDABD"
*/
//如果pattern存在org中,那么返回的是首次出现的org的角标
//否则返回的是-1
int index(char strOrg[], char strPattern[]) {
int i = 0, j = 0;//i是用来推进strOrg,j是用来推进strPattern的
int k = -1;//k是用来返回org中的角标的,默认的我们认为不存在
int orgLength = strlen(strOrg);
int patternLength = strlen(strPattern);
int count = 0;
while (i < orgLength && j < patternLength) {
if (strOrg[i] == strPattern[j]) {
//此时,原串不要向下移动,而是从当前位置开始,看是否有匹配的子串存在
i++;
j++;
}
else {
i = i - j + 1;
j = 0;
}
count++;
}
printf("本算法运行了%d次\n", count);
if (j >= patternLength) {
k = i - patternLength;
}
return k;
}
//****************************Beging KMP
#define MAXLENGTH 1024
//部分匹配值的计算
void GetNext(char str[], int next[]) {
int j = 0;
int k = -1;
next[0] = -1;
while (j < strlen(str)) {
if (k == -1 || str[j] == str[k]) {
j++;
k++;
next[j] = k;
}
else
k = next[k];
}
}
int KMPIndex(char strOrg[], char strPattern[]) {
int next[MAXLENGTH], i = 0, j = 0, pos = -1;
GetNext(strPattern, next);//获得patter串中的每一个字符的部分匹配值
int orgLength = strlen(strOrg);
int patternLength = strlen(strPattern);
int count = 0;
while (i < orgLength && j < patternLength) {
if (j == -1 || strOrg[i] == strPattern[j]) {
i++;
j++;
}
else {
j = next[j];
}
count++;
}
//printf("\n");
printf("本次检索我们一共运行了%d次", count);
if (j >= patternLength) {
pos = i - patternLength;
}
return pos;
}
//****************************END KMP
int main(void) {
//printf("%d ", index("BBC ABCDAB ABCDABCDABDE", "ABCDABD"));
printf("%d ", KMPIndex("BBC ABCDAB ABCDABCDABDE", "ABCDABD"));
getchar();
return 0;
}
KMP算法
字符串匹配算法 KMP
#include<stdio.h>
//串的定长顺序存储表示
#define MAXSTRLEN 50 // // 用户可在50以内定义最大串长
#define MAXLEN 255
typedef struct{
char ch[MAXLEN+1];
int length;
}SString;
char next[MAXLEN];
int indexBF(SString S, SString T, int pos){
int i = pos, j = 1;
while(i <= S.length && j <= T.length){
if(j==0||S.ch[i]==T.ch[j]){
i++;
j++;
}else{
j = next[j];
}
if(j>T.length) return i-T.length;
else return 0;
}
}
void getnext(SString T,int next[]){
int i,j;
i=1;
next[1]=0;
j=0;
while(i<T.length)
{
if(j==0||T.ch[i]==T.ch[j]){
++i;++j;
next[i]=j;
}
else j=next[j];
}
}
void init(SString &S, char str[]){
int i = 0;
while(str[i]!='\0'){
S.ch[i+1] = str[i];
i++;
}
S.ch[i+1] = '\0';
S.ch[0] = i;
}
void printStr(SString Str){
for(int i = 1; i <= Str.ch[0]; i++){
printf("%c", Str.ch[i]);
}
printf("\n");
}
void main(){
SString S ;
init(S, "ababcabcacbab");
printStr(S);
SString T;
init(T, "abcac");
printStr(T);
int index = indexBF(S, T, 1);
printf("index is %d\n", index);
}