标签:赋值 amp 没有 常用 class 定义 匹配 das char
学会了模式匹配,能干的是有多了一件。
但是在学习过程中常用有问题的出现。
1、首先利用BF算法解决。(这是草稿的代码)
//貌似因为定义了几个1000000 大小的字符数组,导致内存超标了 #include <cstring> #include <iostream> using namespace std; #define MAXLEN 10000 typedef struct { char ch[MAXLEN+1]; int lenght; }SString; void SetSString(SString &O) { O.ch[0] = ‘0‘; //初始化 0 的下标 char ch[MAXLEN]; //输入数组 cin >> ch; int len = 0; while(ch[len] != ‘\0‘) //赋值给定义的数组 { O.ch[len+1] = ch[len]; len++; } O.lenght = len; // cout << O.ch << endl; // cout << O.lenght; } int Index_BF(SString S, SString T, int pos) { int i = pos, j = 1; //i 为 主串, j为模式 while(i<=S.lenght && j<=T.lenght) { if(S.ch[i] == T.ch[j]) { i++; j++; } else { i = i - j + 2; j = 1; } } if(j > T.lenght) { return i - T.lenght; } else return 0; } int main() { int pos = 1; SString S, T; SetSString(S); SetSString(T); // cout << strlen(S.ch); if(Index_BF(S, T, pos) != 0) { cout << "successed"; } else cout << "falre"; return 0; }
很明显我忘了一点——函数strlen(),所以我自己写函数获取字符串的长度。因此这也是我后来大问题的原因吧。
2、在写KMP算法时,因为之前打BF算法时忘记书本的内容,所以我很相信书本的例子,所说只是算法,但我加以修改使其变异不出问题即可。(同是草稿)
//KMP 算法 //改用堆存放 #include <iostream> using namespace std; #define MAXLEN 1000000 typedef struct { char *ch; int lenght; }SString; void SetSString(SString &O) { O.ch = new char [MAXLEN + 1]; O.ch[0] = ‘0‘; //初始化 0 的下标 char ch[MAXLEN]; //输入数组 cin >> ch; int len = 0; while(ch[len] != ‘\0‘) //赋值给定义的数组 { O.ch[len+1] = ch[len]; len++; } O.lenght = len; // cout << O.ch << endl; // cout << O.lenght; } int Index_BF(SString S, SString T, int pos, int next[]) { int i = pos, j = 1; //i 为 主串, j为模式 while(i<=S.lenght && j<=T.lenght) { if(S.ch[i] == T.ch[j]) { i++; j++; } else { j = next[j]; //KMP更新 } } if(j > T.lenght) { return i - T.lenght; } else return 0; } //求 next 数组, 及初始化后调用 void get_next(SString T, int next[]) { int i, j; i = 1; j = 0; next[1] = 0; while(i < T.lenght) { if(j==0 || T.ch[i]==T.ch[j]) { i++; j++; next[i] = j; } else j = next[j]; } } int main() { int pos = 1, result; SString S, T; SetSString(S); SetSString(T); //KMP更新 int next[100000]; get_next(T, next); result = Index_BF(S, T, pos, next); if(result != 0) { cout << result; } else cout << 0; return 0; }
我最搞不懂的是为什么有些没问题有些又会死循环。后来抛开书本才发现,有一处没有修改主串i的值(在模式回退到0位置时)。
因此看书本是一件好事但不可尽信书。。。。。。。。。。
3、最后是期望,别出这样的bug,因为相信书。。。。。
标签:赋值 amp 没有 常用 class 定义 匹配 das char
原文地址:https://www.cnblogs.com/ZwQuan/p/10708369.html