diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 15a60bd..e849f17 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -13,7 +13,7 @@ "compilerPath": "C:\\MinGW\\bin\\gcc.exe", "cStandard": "c11", "cppStandard": "c++17", - "intelliSenseMode": "clang-x64" + "intelliSenseMode": "${default}" } ], "version": 4 diff --git a/_03.串/02模式匹配_KMP.c b/_03.串/02模式匹配_KMP.c new file mode 100644 index 0000000..0b09c04 --- /dev/null +++ b/_03.串/02模式匹配_KMP.c @@ -0,0 +1,262 @@ +#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 new file mode 100644 index 0000000..8b7cea3 --- /dev/null +++ b/_03.串/_b.KMP.c @@ -0,0 +1,305 @@ +/* + * @Author: Xu Bai + * @Date: 2019-07-08 21:43:47 + * @LastEditors: Xu Bai + * @LastEditTime: 2019-07-08 22:48:27 + */ +#include "stdio.h" +#include "stdlib.h" +#include "io.h" +#include "string.h" + +#define OK 1 +#define ERROR 0 +#define TRUE 1 +#define FALSE 0 +#define MAXSIZE 100 + +typedef int Status; +typedef int ElemType; +typedef char String[MAXSIZE]; + +/*һֵ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; +} + +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± */ + int j = 1; + /*jΪģʽT± */ + while (i <= S[0] && j <= T[0]) + { + if (S[i] == T[j]) + { + ++i; + ++j; + } + else + { + i = i - j + 2; + j = 1; + } + + if (j > T[0]) + { + return i - T[0]; + } + else + { + return 0; + } + } +} + +/*ģʽTNext */ +void GetNext(String T, int *Next) +{ + int i, j; + i = 1; + j = 0; + Next[1] = 0; + while (i < T[0]) + { + if (j == 0 || T[i] == T[j]) + { + ++i; + ++j; + Next[i] = j; + } + else + { + j = Next[j]; + } + } +} + +/*ӴģʽTSеposַ֮?λãڷ0 */ +int IndexByKMP(String S, String T, int pos) +{ + int i = pos; + int j = 1; + int next[255]; + GetNext(T, next); + while (i <= S[0] && j <= T[0]) + { + if (j == 0 || S[i] = T[i]) + { + ++i; + ++j; + } + else + { + j = next[j]; + } + } + if (j > T[0]) + { + return i - T[0]; + } + else + { + return 0; + } +} + +/*Nextval */ +void GetNextVal(String T, int *NextVal) +{ + int i, j; + i = 1; + j = 0; + NextVal[1] = 0; + while (i < T[0]) + { + if (j == 0 || T[i] == T[j]) + { + /*T[i]ʾ׺ĵַT[j]ǰ׺ */ + ++i; + ++j; + if (T[i] != T[j]) + { + /*ǰַǰ׺ַͬǰjΪNextValiλõֵ*/ + NextVal[i] = j; + } + else + { + /*ǰ׺ַͬǰ׺ַnextvalֵֵnextvaliλõֵ */ + NextVal[i] = NextVal[j]; + } + } + else + { + /*ַͬj */ + j = NextVal[j]; + } + } +} + +int IndexByKMP2(String S, String T, int pos) +{ + /*iSǰλ±ֵ */ + int i = pos; + int j = 1; + int next[255]; + GetNextVal(T, next); + while (i <= S[0] && j <= T[0]) + { + /* iСSijȲjСTijʱѭ */ + if (j == 0 || S[i] == T[j]) + { + ++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)); + + getchar(); + return OK; +} \ No newline at end of file