diff --git a/DataStructure/test5/实验五.cpp b/DataStructure/test5/实验五.cpp new file mode 100644 index 0000000..f05755b --- /dev/null +++ b/DataStructure/test5/实验五.cpp @@ -0,0 +1,119 @@ +#include +#include +#include +int nextval[20]; + +int BF(char a[], char b[]) +{ + int i = 1; + int j = 1; + while (i <= strlen(a) && j <= strlen(b)) + { + // todo list ±È½ÏÊý×éa¡¢bÀï¶ÔӦλÖõÄ×Ö·û£º + // ÈôÆ¥Åä³É¹¦£¬Ôò¼ÌÐø±È½ÏºóÐø×Ö·û£» + // ÈôÆ¥Åä²»³É¹¦£¬iÖ¸Õë¡¢jÖ¸Õë»ØÍË£¬ÖØÐ¿ªÊ¼Æ¥Åä + if (a[i - 1] == b[j - 1]) + { + i++, j++; + } + else + { + i = i - j + 2; + j = 1; + } + } + if (j > strlen(b)) + { + printf("BFË㷨ƥÅä³É¹¦\n"); + // todo list //·µ»ØºÍģʽbÖеÚÒ»¸ö×Ö·ûÏàµÈµÄ×Ö·ûÔÚÖ÷´®aÖеÄÐòºÅ + return i - strlen(b); + } + else + { + printf("BFË㷨ƥÅäʧ°Ü\n"); + return 0; + } +} + +void Nextval(char b[]) +{ + nextval[1] = 0; + int i = 1, j = 0; + // todo list while Ñ­»·Çónextval + while (i < strlen(b)) + { + if (j == 0 || b[i - 1] == b[j - 1]) + { + i++; + j++; + if (b[i - 1] != b[j - 1]) + { + nextval[i - 1] = j; + } + else + { + nextval[i - 1] = nextval[j - 1]; + } + } + else + { + j = nextval[j - 1]; + } + } +} + +int KMP(char a[], char b[]) +{ + int i = 1, j = 1, k; + Nextval(b); // Çób´®ÖÐËùÓÐ×Ö·ûµÄnextvalÖµ + for (k = 1; k <= strlen(b); k++) + { + printf("nextval[%d]Ϊ£º%4d\n", k, nextval[k]); + } + while (i <= strlen(a) && j <= strlen(b)) + { + // todo list ±È½ÏÊý×éa¡¢bÀï¶ÔӦλÖõÄ×Ö·û£º + // ÈôÆ¥Åä³É¹¦£¬Ôò¼ÌÐø±È½ÏºóÐø×Ö·û£» + // ÈôÆ¥Åä²»³É¹¦£¬ÀûÓÃnextval[j]ʵÏÖjÖ¸Õë»ØÍË£¬ÖØÐ¿ªÊ¼Æ¥Åä + if (j == 0 || a[i - 1] == b[j - 1]) + { + i++; + j++; + } + else + { + j = nextval[j - 1]; + } + } + if (j > strlen(b)) + { + printf("KMPË㷨ƥÅä³É¹¦£¡\n"); + // todo list //·µ»ØºÍģʽbÖеÚÒ»¸ö×Ö·ûÏàµÈµÄ×Ö·ûÔÚÖ÷´®aÖеÄÐòºÅ + return i - strlen(b); + } + else + { + printf("KMPË㷨ƥÅäʧ°Ü£¡\n"); + return 0; + } +} + +int main() +{ + char a[100], b[20]; + printf("ÇëÊäÈëÖ÷´®:\n"); + scanf("%s", a); + + // gets_s(a); + printf("ÇëÊäÈë×Ó´®:\n"); + scanf("%s", b); + + // gets_s(b); + printf("------------------------------------\n"); + int num_BF, num_KMP; + num_BF = BF(a, b); + printf("BF:×Ó´®µÄµÚÒ»¸ö×Ö·ûÔÚÖ÷´®ÖеÄλÖÃΪ£º%d\n", num_BF); + printf("------------------------------------\n"); + num_KMP = KMP(a, b); + printf("KMP:×Ó´®µÄµÚÒ»¸ö×Ö·ûÔÚÖ÷´®ÖеÄλÖÃΪ£º%d", num_KMP); +}