数据结构:4.串

216 阅读2分钟

1.串的定义和实现

    // 4.1 串的定义和实现
   
    // 4.1.1 串的定义:串是由零个或者多个字符组成的有限序列

    // 4.1.2 串的存储结构
    //      1. 定长顺序存储表示:一组地址连续的存储单元
    //        #define MAXLEN 255
    //        typedef struct {
    //          char ch[MAXLEN];
    //          int length;
    //        }SString;
    //      2. 堆分配存储表示:一组地址连续的存储单元,但是,动态分配存储单元
    //        typedef struct {
    //          char *ch;
    //          int length;
    //        }HString;
    //      3. 块链存储表示
    //        链表方式存储串值

    // 4.1.3 串的基本操作
    //      StrAssign(&T, chars) // 赋值,串类型最小操作子集
    //      StrCopy(&T, S) // 复制
    //      StrEmpty(S) // 判空
    //      StrCompare(S, T) // 比较,串类型最小操作子集
    //      StrLength(S) // 求串长,串类型最小操作子集
    //      SubString(&Sub, S, pop, len) // 求子串,串类型最小操作子集
    //      Concat(&T, S1, S2) // 串联接,串类型最小操作子集
    //      Index(S, T) // 定位
    //      ClearString(&S) // 清空
    //      DestroyString(&S) // 串销毁

2. 串的模式匹配

     // 4.2 串的模式匹配

    // 4.2.1 简单的模式匹配算法
    //      模式匹配:子串的定位操作通常称为串的模式匹配,它求的是子串在主串中的位置
    //      暴力匹配:时间复杂度为O(nm)

    // 4.2.2 改进的模式匹配算法-KMP算法
    //      1. 字符串的前缀、后缀和部分匹配值
    //        前缀:除最后一个字符以外,字符串的所有头部子串
    //        后缀:除第一个字符以外,字符串所有的尾部子串
    //        部分匹配值:字符串的前缀和后缀的最长相等前后缀长度
    //        失配时,字串右移动:右移位数 = 已匹配的字符数 - 对应的部分匹配值
    //      2. KMP算法的原理
    //        next[j]的含义是:在子串的第j个字符与主串发生失配时,则跳到子串的next[j]位置重新与主串当前位置进行比较
    //        next数组的一般公式
    //      3. KMP算法时间复杂度:O(m+n)

    // 4.2.3 KMP算法的进一步优化
    //      nextval数组:如果P(j) = P(next(j)),则next(j)修正为next(next(j))

3. 应用题

    // 设有字符串S = ‘aabaabaabaac’,P=‘aabaac’
    // 1)求出P的next数组
    // 2)若S作主串,P做模式串,试给出KMP算法的匹配过程

    // 1)

    // a = 0
    // aa = 1
    // aab = {a,aa} {b, ab} = 0
    // aaba = {a,aa, aab} {a,ba,aba} = 1
    // aabaa = {a,aa,aab,aaba} {a,aa,baa,abaa} = 2
    // aabaac = {a,aa,aab,aaba,aabaa} {c,ac,aac,baac,abaac} = 0

    // a a b a a c
    // 0 1 0 1 2 0
    // -1 0 1 0 1 2
    // 0 1 2 1 2 3

    // next数组:[0,1,2,1,2,3]

    // 2)
    // a a b a a b a a b a a c
    // a a b a a c
    //       a a b a a c
    //             a a b a a c