尽信书不如无书

Posted zwquan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尽信书不如无书相关的知识,希望对你有一定的参考价值。

学会了模式匹配,能干的是有多了一件。

但是在学习过程中常用有问题的出现。

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] != )  //赋值给定义的数组 
    {
        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] != )  //赋值给定义的数组 
    {
        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,因为相信书。。。。。

以上是关于尽信书不如无书的主要内容,如果未能解决你的问题,请参考以下文章

尽信书不如无书

微信小程序代码片段

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板