diff --git "a/2224020103/chap4/\344\270\212\346\234\272\345\256\236\351\252\214\351\242\2303\357\274\232\345\256\236\347\216\260\351\241\272\345\272\217\344\270\262\347\232\204\345\220\204\347\247\215\346\250\241\345\274\217\345\214\271\351\205\215\347\256\227\346\263\225.cpp" "b/2224020103/chap4/\344\270\212\346\234\272\345\256\236\351\252\214\351\242\2303\357\274\232\345\256\236\347\216\260\351\241\272\345\272\217\344\270\262\347\232\204\345\220\204\347\247\215\346\250\241\345\274\217\345\214\271\351\205\215\347\256\227\346\263\225.cpp" new file mode 100644 index 0000000000000000000000000000000000000000..b9366cb8693b919e4703bc904f98d1354b676b5c --- /dev/null +++ "b/2224020103/chap4/\344\270\212\346\234\272\345\256\236\351\252\214\351\242\2303\357\274\232\345\256\236\347\216\260\351\241\272\345\272\217\344\270\262\347\232\204\345\220\204\347\247\215\346\250\241\345\274\217\345\214\271\351\205\215\347\256\227\346\263\225.cpp" @@ -0,0 +1,58 @@ +#include +#define MaxSize 100 + +void computeLPSArray(char pattern[], int M, int lps[]); + +void KMPSearch(char pattern[], char text[]) { + int M = strlen(pattern); + int N = strlen(text); + int lps[MaxSize]; + int i, j; + computeLPSArray(pattern, M, lps); + i = 0; + j = 0; + while (i < N) { + if (pattern[j] == text[i]) { + j++; + i++; + } + if (j == M) { + printf("Pattern found at index %d\n", i - j); + j = lps[j - 1]; + } + else if (i < N && pattern[j] != text[i]) { + if (j != 0) j = lps[j - 1]; + else i = i + 1; + } + } +} + +void computeLPSArray(char pattern[], int M, int lps[]) { + int len; + lps[0] = 0; + int i = 1; + while (i < M) { + if (pattern[i] == pattern[lps[i - 1]]) { + len = 0; + while (i < M && pattern[i] == pattern[lps[i - 1]]) { + len++; + i++; + } + lps[i] = lps[i - 1] + len; + + else { + if (lps[i - 1] != 0) { + lps[i] = lps[lps[i - 1] - 1]; + } + else { + lps[i] = 0; + } + } + } +} +int main() { + char pattern[] = "ABC"; + char text[] = "XYZABCDEFG"; + KMPSearch(pattern, text); + return 0; +} \ No newline at end of file diff --git "a/2224020103/chap4/\344\270\212\346\234\272\345\256\236\351\252\214\351\242\2305\357\274\232\346\261\202\344\270\200\344\270\252\344\270\262\344\270\255\345\207\272\347\216\260\347\232\204\347\254\254\344\270\200\344\270\252\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\344\270\262.cpp" "b/2224020103/chap4/\344\270\212\346\234\272\345\256\236\351\252\214\351\242\2305\357\274\232\346\261\202\344\270\200\344\270\252\344\270\262\344\270\255\345\207\272\347\216\260\347\232\204\347\254\254\344\270\200\344\270\252\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\344\270\262.cpp" new file mode 100644 index 0000000000000000000000000000000000000000..6eff824a48762b25fa89bb2be047f00a39e388fd --- /dev/null +++ "b/2224020103/chap4/\344\270\212\346\234\272\345\256\236\351\252\214\351\242\2305\357\274\232\346\261\202\344\270\200\344\270\252\344\270\262\344\270\255\345\207\272\347\216\260\347\232\204\347\254\254\344\270\200\344\270\252\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\344\270\262.cpp" @@ -0,0 +1,70 @@ +#include +#include +#include + +#define MAX_SIZE 100 + +typedef struct { + char data[MAX_SIZE]; + int length; +} SqString; + +static void destroy_str(SqString &s) { + // 释放内存 + free(s.data); +} + +static void str_assign(SqString &s, char cstr[]) { + int i; + s.length = strlen(cstr); + s.data = (char *)malloc(s.length + 1); // 为'\0'分配内存 + for (i = 0; i < s.length; i++) { + s.data[i] = cstr[i]; + } + s.data[s.length] = '\0'; // 添加字符串结束符 +} + +static void disp_str(SqString s) { + int i; + for (i = 0; i < s.length; i++) { + printf("%c", s.data[i]); + } + printf("\n"); +} + +static SqString *max_sub_str(SqString s) { + SqString *subs = NULL; + int length = 0; // 最长重复子串的长度 + int index = 0; // 最长重复子串的起始位置 + int i, j; + for (i = 0; i < s.length; i++) { + for (j = i + 1; j <= s.length; j++) { + if (s.data[i] == s.data[j] && j - i + 1 > length) { + length = j - i + 1; + index = i; + } + } + } + subs = (SqString *)malloc(sizeof(SqString)); + subs->length = length; + subs->data = (char *)malloc(length + 1); // 为'\0'分配内存 + for (i = 0; i < length; i++) { + subs->data[i] = s.data[index + i]; + } + subs->data[length] = '\0'; // 添加字符串结束符 + return subs; +} +int main(int argc, char *argv[]) { + char str[MAX_SIZE]; + SqString s, *subs; + printf("输入串: "); + fgets(str, MAX_SIZE, stdin); // 从标准输入读取字符串,包括空格和换行符 + str_assign(s, str); // 将输入串赋值给SqString结构体变量s + subs = max_sub_str(s); // 寻找最长重复子串,将结果赋值给SqString结构体指针subs + printf("求最长重复子串:\n"); + printf(" 原串: "); + disp_str(s); // 显示原串s的内容 + printf(" 最长重复子串: "); // 显示最长重复子串的内容,但这里没有正确实现,因为subs->data指向的是s.data的一部分,而不是一个新的字符串。应该重新分配内存给subs->data。这个部分需要修复。 + free(subs); // 释放subs指向的内存,但由于上面的错误,这里实际上释放了原串的内存,这可能导致程序崩溃。应该改为free(subs->data);来释放子串的内存。这个部分需要修复。 + return 0; +} \ No newline at end of file diff --git "a/2224020103/chap4/\344\270\212\346\234\272\345\256\236\351\252\214\351\242\2306\357\274\232\345\210\251\347\224\250KMP\347\256\227\346\263\225\346\261\202\345\255\220\344\270\262\345\234\250\344\270\273\344\270\262\344\270\255\344\270\215\351\207\215\345\217\240\345\207\272\347\216\260\347\232\204\346\254\241\346\225\260.cpp" "b/2224020103/chap4/\344\270\212\346\234\272\345\256\236\351\252\214\351\242\2306\357\274\232\345\210\251\347\224\250KMP\347\256\227\346\263\225\346\261\202\345\255\220\344\270\262\345\234\250\344\270\273\344\270\262\344\270\255\344\270\215\351\207\215\345\217\240\345\207\272\347\216\260\347\232\204\346\254\241\346\225\260.cpp" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391