2020-06-13 学习笔记

第五章 串

串:由零个或多个字符组成的有限序列,又名叫字符串。


朴素模式匹配算法:

时间复杂度为 O(n+m)                  最坏情况时间复杂度: O((n-m+1)*m)

KMP模式匹配算法(时间复杂度:O(n+m))(好马不吃回头草):

K—克努特 M—莫里斯 P—普拉特

以下是我从网上找的kmp算法讲解链接:
https://www.bilibili.com/video/BV1Ys411d7yh?from=search&seid=18429832824354750254

//构建子串next数组(改进版)
void get_nextval(String T, int *nextval)
{
    int i,j;
    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];
    }
} //当a位字符与它next值指向的b位字符相等,则该a位的nextval就指向b位的nextval值。
//与主串比较(返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回0)
int Index_KMP(String S, String T, int pos)
{
    int i = pos;
    int j = 1;
    int nextval[255];
    get_nextval(T, nextval);
    while (i <= S[0] && j <= T[0])
    {
        if (j == 0 || S[i] == T[j])
        {
            ++i;
            ++j;
        }
        else
            j = nextval[j];
    }
    if (j > T[0])
        return i - T[0];
    else
        return 0;
}
tips:

1.空串:零个字符的串。
2.ASCII编码:由8位二进制数表示一个字符,总共表示256个字符。
Unicode编码:由16位二进制数表示一个字符,总共表示2^16个字符。与ASCII兼容,前256个字符完全相同。
3.串的模式匹配:子串的定位操作。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。