五. 串

作者: CoCc | 来源:发表于2023-02-06 01:13 被阅读0次

串是由零个或多个字符组成的有限序列,又名叫字符串。
朴素的模式匹配算法

#define String char*

/*返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。*/
int Index(String S, String T, int pos) {
    int i = pos; //i用于主串S中当前位置下标,若pos不为1则从pos位置开始
    int j = 1; //j用于子串T中当前位置下标值
    while (i <= S[0] && j <= T[0]) { //若i小于S长度且j小于T的长度时循环
        if (S[i] == T[i]) { //两字母相等则继续
            ++i;
            ++j;
        } else { //指针后退重新开始匹配
            i = i - j + 2; //i退回到上次匹配首位的下一位
            j = 1; //j退回到子串T的首位
        }
    }
    if (j > T[0]) {
        return i - T[0];
    } else {
        return 0;
    }
}

KMP模式匹配算法

为了避免重复遍历的情况,三位前辈发表了一个模式匹配算法,称之为克努特-莫里斯-普拉特算法,简称KMP算法。

void get_next(String T, int *next) {
    int i = 1, j = 0;
    next[1] = 0;
    while (i < T[0]) { //此处T[0]表示串T的长度
        if (j == 0 || T[i] == T[j]) { /*
                                       T[i]表示后缀的单个字符
                                       T[j]表示前缀的单个字符
                                       */
            ++i;
            ++j;
            next[i] = j;
        } else {
            j = next[j]; //若字符不相同,则j值回溯
        }
    }
}

int Index_KMP(String S, String T, int pos) {
    int i = pos;
    int j = 1;
    int next[255];
    while (i < S[0] && j <= T[0]) {
        if (j == 0 || T[i] == T[j]) {
            ++i;
            ++j;
            next[i] = j;
        } else {
            j = next[j];
        }
    }
    if (j > T[0]) {
        return i - T[0];
    } else {
        return 0;
    }
}

get_next函数进行改良

void get_nextval(String T, int *nextval) {
    int i = 1, j = 0;
    nextval[1] = 0;
    while (i < T[0]) {
        if (j == 0 || T[i] == T[j]) {
            ++i;
            ++j;
            if (T[i] != T[j]) {
                nextval[i] = j;
            } else {
                nextval[i] = nextval[j];
            }
        } else {
            j = nextval[j];
        }
    }
}d4dd

相关文章

  • 幽默段子笑话:今晚吃了饭在小区闲逛,发现一对小情侣吵架闹分手

    1.女朋友跟我分手了。万念俱灰的我,关紧门窗烧了一盆火炭,烤了三十串羊肉三十串脆骨十串羊腰五串韭菜五串辣椒五串香辣...

  • 糖葫芦

    糖葫芦啊,糖葫芦, 串一串啊,串一串, 五个串一串, 味道酸又甜。

  • 戊戌年正月初八忆梯子岭

    酒后望南山,一串接一串。西方有琵琶,五弦弹五弦。

  • 串串

    诗/图:九月的风1988 一串两串三四串, 五串六串七八串。 红油麻辣一串串, 鲜椒葱蒜来客串。 备注:和老婆大人...

  • 大话数据结构学习笔记(5)

    第五章 串 串:串是由零个或多个字符组成的有限序列,又名叫字符串。 串中字符数目n称为串的长度。 零个字符的串称为...

  • 字符串(五)

    检测前缀或后缀 在处理字符串时,有时需要检测字符串是否以某个前缀开头或以某个后缀结束,这时可以使用startswi...

  • 《Redis设计与实现》学习笔记(未完--持续更新)

    一、字符串 SDS Redis的底层的字符串并不是使用C语言字符串(C字符串),而是自己定义了动态字符串 五种数据...

  • redis数据结构

    五种数据结构 字符串(String) 哈希(hash) 字符串列表(list) 字符串集合(set) 有序字符串集...

  • PAT (Basic Level):1039 到底买不买(20)

    题目信息 小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是...

  • PTA 1039 到底买不买 (20 分)

    题目 小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红...

网友评论

      本文标题:五. 串

      本文链接:https://www.haomeiwen.com/subject/rfvpiftx.html