1. 程式人生 > >盡信書不如無書

盡信書不如無書

問題 給定 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, 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,因為相信書。。。。。

盡信書不如無書