From 3fc7def6f056a565d706fe09d3a8a3d603757555 Mon Sep 17 00:00:00 2001 From: Xu Bai <1373953675@qq.com> Date: Mon, 8 Jul 2019 22:53:30 +0800 Subject: [PATCH] =?UTF-8?q?KMP=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _03.串/02模式匹配_KMP.c | 262 ---------------------------------------- _03.串/_b.KMP.c | 150 +++++++++++------------ a.out | Bin 54583 -> 53340 bytes 3 files changed, 75 insertions(+), 337 deletions(-) delete mode 100644 _03.串/02模式匹配_KMP.c 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 8e41c6fdad870047321ee1b3b44679c755558452..381bffcaa996b01f974b30fa183b51fb495551d6 100644 GIT binary patch delta 15765 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 HwITlt3qj%^ delta 16587 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