盡信書不如無書
阿新 • • 發佈:2019-04-15
問題 給定 color stream 代碼 不可 while 內容 next
學會了模式匹配,能幹的是有多了一件。
但是在學習過程中常用有問題的出現。
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, intpos) { 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,因為相信書。。。。。
盡信書不如無書