diff --git a/_03.串/02模式匹配_KMP.c b/_03.串/02模式匹配_KMP.c deleted file mode 100644 index 0b09c04..0000000 --- a/_03.串/02模式匹配_KMP.c +++ /dev/null @@ -1,262 +0,0 @@ -#include "string.h" -#include "stdio.h" -#include "stdlib.h" -#include "io.h" -#include "math.h" -#include "time.h" - -#define OK 1 -#define ERROR 0 -#define TRUE 1 -#define FALSE 0 -#define MAXSIZE 100 /* 洢ռʼ */ - -typedef int Status; /* StatusǺ,ֵǺ״̬룬OK */ -typedef int ElemType; /* ElemType͸ʵΪint */ - -typedef char String[MAXSIZE + 1]; /* 0ŵԪŴij */ - -/* һֵcharsĴT */ -Status StrAssign(String T, char *chars) -{ - int i; - if (strlen(chars) > MAXSIZE) - return ERROR; - else - { - T[0] = strlen(chars); - for (i = 1; i <= T[0]; i++) - T[i] = *(chars + i - 1); - return OK; - } -} - -Status ClearString(String S) -{ - S[0] = 0; /* Ϊ */ - return OK; -} - -/* ַT */ -void StrPrint(String T) -{ - int i; - for (i = 1; i <= T[0]; i++) - printf("%c", T[i]); - printf("\n"); -} - -/* Nextֵ */ -void NextPrint(int next[], int length) -{ - int i; - for (i = 1; i <= length; i++) - printf("%d", next[i]); - printf("\n"); -} - -/* شԪظ */ -int StrLength(String S) -{ - return S[0]; -} - -/* صģʽƥ䷨ */ -int Index(String S, String T, int pos) -{ - int i = pos; /* iSеǰλ±ֵposΪ1posλÿʼƥ */ - int j = 1; /* jӴTеǰλ±ֵ */ - while (i <= S[0] && j <= T[0]) /* iСSijȲjСTijʱѭ */ - { - if (S[i] == T[j]) /* ĸ */ - { - ++i; - ++j; - } - else /* ָ¿ʼƥ */ - { - i = i - j + 2; /* i˻صϴƥλһλ */ - j = 1; /* j˻صӴTλ */ - } - } - if (j > T[0]) - return i - T[0]; - else - return 0; -} - -/* ͨ㷵ӴTnext顣 */ -void get_next(String T, int *next) -{ - int i, j; - i = 1; - j = 0; - next[1] = 0; - while (i < T[0]) /* ˴T[0]ʾTij */ - { - if (j == 0 || T[i] == T[j]) /* T[i]ʾ׺ĵַT[j]ʾǰ׺ĵַ */ - { - ++i; - ++j; - next[i] = j; - } - else - j = next[j]; /* ַͬjֵ */ - } -} - -/* ӴTSеposַ֮λáڣֵΪ0 */ -/* Tǿգ1posStrLength(S) */ -int Index_KMP(String S, String T, int pos) -{ - int i = pos; /* iSеǰλ±ֵposΪ1posλÿʼƥ */ - int j = 1; /* jӴTеǰλ±ֵ */ - int next[255]; /* һnext */ - get_next(T, next); /* ԴTõnext */ - while (i <= S[0] && j <= T[0]) /* iСSijȲjСTijʱѭ */ - { - if (j == 0 || S[i] == T[j]) /* ĸ㷨j=0ж */ - { - ++i; - ++j; - } - else /* ָ¿ʼƥ */ - j = next[j]; /* j˻غʵλãiֵ */ - } - if (j > T[0]) - return i - T[0]; - else - return 0; -} - -/* ģʽTnextֵnextval */ -void get_nextval(String T, int *nextval) -{ - int i, j; - i = 1; - j = 0; - nextval[1] = 0; - while (i < T[0]) /* ˴T[0]ʾTij */ - { - if (j == 0 || T[i] == T[j]) /* T[i]ʾ׺ĵַT[j]ʾǰ׺ĵַ */ - { - ++i; - ++j; - if (T[i] != T[j]) /* ǰַǰ׺ַͬ */ - nextval[i] = j; /* ǰjΪnextvaliλõֵ */ - else - nextval[i] = nextval[j]; /* ǰ׺ַͬǰ׺ַ */ - /* nextvalֵֵnextvaliλõֵ */ - } - else - j = nextval[j]; /* ַͬjֵ */ - } -} - -int Index_KMP1(String S, String T, int pos) -{ - int i = pos; /* iSеǰλ±ֵposΪ1posλÿʼƥ */ - int j = 1; /* jӴTеǰλ±ֵ */ - int next[255]; /* һnext */ - get_nextval(T, next); /* ԴTõnext */ - while (i <= S[0] && j <= T[0]) /* iСSijȲjСTijʱѭ */ - { - if (j == 0 || S[i] == T[j]) /* ĸ㷨j=0ж */ - { - ++i; - ++j; - } - else /* ָ¿ʼƥ */ - j = next[j]; /* j˻غʵλãiֵ */ - } - if (j > T[0]) - return i - T[0]; - else - return 0; -} - -int main() -{ - int i, *p; - String s1, s2; - - StrAssign(s1, "abcdex"); - printf("ӴΪ: "); - StrPrint(s1); - i = StrLength(s1); - p = (int *)malloc((i + 1) * sizeof(int)); - get_next(s1, p); - printf("NextΪ: "); - NextPrint(p, StrLength(s1)); - printf("\n"); - - StrAssign(s1, "abcabx"); - printf("ӴΪ: "); - StrPrint(s1); - i = StrLength(s1); - p = (int *)malloc((i + 1) * sizeof(int)); - get_next(s1, p); - printf("NextΪ: "); - NextPrint(p, StrLength(s1)); - printf("\n"); - - StrAssign(s1, "ababaaaba"); - printf("ӴΪ: "); - StrPrint(s1); - i = StrLength(s1); - p = (int *)malloc((i + 1) * sizeof(int)); - get_next(s1, p); - printf("NextΪ: "); - NextPrint(p, StrLength(s1)); - printf("\n"); - - StrAssign(s1, "aaaaaaaab"); - printf("ӴΪ: "); - StrPrint(s1); - i = StrLength(s1); - p = (int *)malloc((i + 1) * sizeof(int)); - get_next(s1, p); - printf("NextΪ: "); - NextPrint(p, StrLength(s1)); - printf("\n"); - - StrAssign(s1, "ababaaaba"); - printf(" ӴΪ: "); - StrPrint(s1); - i = StrLength(s1); - p = (int *)malloc((i + 1) * sizeof(int)); - get_next(s1, p); - printf(" NextΪ: "); - NextPrint(p, StrLength(s1)); - get_nextval(s1, p); - printf("NextValΪ: "); - NextPrint(p, StrLength(s1)); - printf("\n"); - - StrAssign(s1, "aaaaaaaab"); - printf(" ӴΪ: "); - StrPrint(s1); - i = StrLength(s1); - p = (int *)malloc((i + 1) * sizeof(int)); - get_next(s1, p); - printf(" NextΪ: "); - NextPrint(p, StrLength(s1)); - get_nextval(s1, p); - printf("NextValΪ: "); - NextPrint(p, StrLength(s1)); - - printf("\n"); - - StrAssign(s1, "00000000000000000000000000000000000000000000000001"); - printf("Ϊ: "); - StrPrint(s1); - StrAssign(s2, "0000000001"); - printf("ӴΪ: "); - StrPrint(s2); - printf("\n"); - printf("Ӵڵ%dַ״ƥ䣨ģʽƥ㷨\n", Index(s1, s2, 1)); - printf("Ӵڵ%dַ״ƥ䣨KMP㷨 \n", Index_KMP(s1, s2, 1)); - printf("Ӵڵ%dַ״ƥ䣨KMP㷨 \n", Index_KMP1(s1, s2, 1)); - - return 0; -} diff --git a/_03.串/_b.KMP.c b/_03.串/_b.KMP.c index 8b7cea3..f7f33f1 100644 --- a/_03.串/_b.KMP.c +++ b/_03.串/_b.KMP.c @@ -2,7 +2,7 @@ * @Author: Xu Bai * @Date: 2019-07-08 21:43:47 * @LastEditors: Xu Bai - * @LastEditTime: 2019-07-08 22:48:27 + * @LastEditTime: 2019-07-08 22:53:07 */ #include "stdio.h" #include "stdlib.h" @@ -133,7 +133,7 @@ int IndexByKMP(String S, String T, int pos) GetNext(T, next); while (i <= S[0] && j <= T[0]) { - if (j == 0 || S[i] = T[i]) + if (j == 0 || S[i] == T[i]) { ++i; ++j; @@ -186,7 +186,7 @@ void GetNextVal(String T, int *NextVal) } } -int IndexByKMP2(String S, String T, int pos) +int IndexByKMP1(String S, String T, int pos) { /*iSǰλ±ֵ */ int i = pos; @@ -219,86 +219,86 @@ int IndexByKMP2(String S, String T, int pos) int main() { - int i, *p; - String s1, s2; + int i, *p; + String s1, s2; - StrAssign(s1, "abcdex"); - printf("ӴΪ: "); - StrPrint(s1); - i = StrLength(s1); - p = (int *)malloc((i + 1) * sizeof(int)); - get_next(s1, p); - printf("NextΪ: "); - NextPrint(p, StrLength(s1)); - printf("--------------------------------\n"); + StrAssign(s1, "abcdex"); + printf("ӴΪ: "); + StrPrint(s1); + i = StrLength(s1); + p = (int *)malloc((i + 1) * sizeof(int)); + GetNext(s1, p); + printf("NextΪ: "); + NextPrint(p, StrLength(s1)); + printf("--------------------------------\n"); - StrAssign(s1, "abcabx"); - printf("ӴΪ: "); - StrPrint(s1); - i = StrLength(s1); - p = (int *)malloc((i + 1) * sizeof(int)); - get_next(s1, p); - printf("NextΪ: "); - NextPrint(p, StrLength(s1)); - printf("--------------------------------\n"); + StrAssign(s1, "abcabx"); + printf("ӴΪ: "); + StrPrint(s1); + i = StrLength(s1); + p = (int *)malloc((i + 1) * sizeof(int)); + GetNext(s1, p); + printf("NextΪ: "); + NextPrint(p, StrLength(s1)); + printf("--------------------------------\n"); - StrAssign(s1, "ababaaaba"); - printf("ӴΪ: "); - StrPrint(s1); - i = StrLength(s1); - p = (int *)malloc((i + 1) * sizeof(int)); - get_next(s1, p); - printf("NextΪ: "); - NextPrint(p, StrLength(s1)); - printf("--------------------------------\n"); + StrAssign(s1, "ababaaaba"); + printf("ӴΪ: "); + StrPrint(s1); + i = StrLength(s1); + p = (int *)malloc((i + 1) * sizeof(int)); + GetNext(s1, p); + printf("NextΪ: "); + NextPrint(p, StrLength(s1)); + printf("--------------------------------\n"); - StrAssign(s1, "aaaaaaaab"); - printf("ӴΪ: "); - StrPrint(s1); - i = StrLength(s1); - p = (int *)malloc((i + 1) * sizeof(int)); - get_next(s1, p); - printf("NextΪ: "); - NextPrint(p, StrLength(s1)); - printf("--------------------------------\n"); + StrAssign(s1, "aaaaaaaab"); + printf("ӴΪ: "); + StrPrint(s1); + i = StrLength(s1); + p = (int *)malloc((i + 1) * sizeof(int)); + GetNext(s1, p); + printf("NextΪ: "); + NextPrint(p, StrLength(s1)); + printf("--------------------------------\n"); - StrAssign(s1, "ababaaaba"); - printf(" ӴΪ: "); - StrPrint(s1); - i = StrLength(s1); - p = (int *)malloc((i + 1) * sizeof(int)); - get_next(s1, p); - printf(" NextΪ: "); - NextPrint(p, StrLength(s1)); - get_nextval(s1, p); - printf("NextValΪ: "); - NextPrint(p, StrLength(s1)); - printf("--------------------------------\n"); + StrAssign(s1, "ababaaaba"); + printf(" ӴΪ: "); + StrPrint(s1); + i = StrLength(s1); + p = (int *)malloc((i + 1) * sizeof(int)); + GetNext(s1, p); + printf(" NextΪ: "); + NextPrint(p, StrLength(s1)); + GetNextVal(s1, p); + printf("NextValΪ: "); + NextPrint(p, StrLength(s1)); + printf("--------------------------------\n"); - StrAssign(s1, "aaaaaaaab"); - printf(" ӴΪ: "); - StrPrint(s1); - i = StrLength(s1); - p = (int *)malloc((i + 1) * sizeof(int)); - get_next(s1, p); - printf(" NextΪ: "); - NextPrint(p, StrLength(s1)); - get_nextval(s1, p); - printf("NextValΪ: "); - NextPrint(p, StrLength(s1)); + StrAssign(s1, "aaaaaaaab"); + printf(" ӴΪ: "); + StrPrint(s1); + i = StrLength(s1); + p = (int *)malloc((i + 1) * sizeof(int)); + GetNext(s1, p); + printf(" NextΪ: "); + NextPrint(p, StrLength(s1)); + GetNextVal(s1, p); + printf("NextValΪ: "); + NextPrint(p, StrLength(s1)); - printf("--------------------------------\n"); + printf("--------------------------------\n"); - StrAssign(s1, "00000000000000000000000000000000000000000000000001"); - printf("Ϊ: "); - StrPrint(s1); - StrAssign(s2, "0000000001"); - printf("ӴΪ: "); - StrPrint(s2); - printf("--------------------------------\n"); - printf("Ӵڵ%dַ״ƥ䣨ģʽƥ㷨\n", Index(s1, s2, 1)); - printf("Ӵڵ%dַ״ƥ䣨KMP㷨 \n", Index_KMP(s1, s2, 1)); - printf("Ӵڵ%dַ״ƥ䣨KMP㷨 \n", Index_KMP1(s1, s2, 1)); + StrAssign(s1, "00000000000000000000000000000000000000000000000001"); + printf("Ϊ: "); + StrPrint(s1); + StrAssign(s2, "0000000001"); + printf("ӴΪ: "); + StrPrint(s2); + printf("--------------------------------\n"); + printf("Ӵڵ%dַ״ƥ䣨ģʽƥ㷨\n", Index(s1, s2, 1)); + printf("Ӵڵ%dַ״ƥ䣨KMP㷨 \n", IndexByKMP(s1, s2, 1)); + printf("Ӵڵ%dַ״ƥ䣨KMP㷨 \n", IndexByKMP1(s1, s2, 1)); getchar(); return OK; diff --git a/a.out b/a.out index 8e41c6f..381bffc 100644 Binary files a/a.out and b/a.out differ