笔记_408_数据结构_04. 串

04. 串

4.1 概述

4.1.1 串的定义和基本操作

在这里插入图片描述

术语

  • 长度:串中字符的数目 n n n
  • 子串:串中任意个连续的字符组成的子序列
  • 主串:包含子串的串
  • 字符在主串中的位置:字符在串中的序号
  • 子串在主串中的位置:子串的第一个字符在主串中的位置

4.1.2 串的存储结构

在这里插入图片描述

  • 顺序存储
    在这里插入图片描述

    • 静态数组实现(定长顺序存储)

      c# define MAXLEN 255		// 预定义最大串长 255
      typedef struct{
          char ch[MAXLEN];	// 每个分量存储一个字符
          int length;			// 串的实际长度
      }SString;
      
    • 动态数组实现(堆分配存储)

      typedef struct{
          char *ch;		// 按串长分配存储区,ch指向串的基地址
          int length;		// 串的实际长度
      }HString;
      
      HString S;
      S.ch = (char *)malloc(MAXLEN * sizeof(char));
      S.length = 0;
      
  • 链式存储

    • 存储密度低
      在这里插入图片描述

      typedef struct StringNode{
          char ch;
          struct StringNode * next;
      }StringNode,*String;
      
    • 存储密度高
      在这里插入图片描述

      typedef struct StringNode{
          char ch[4];		// 每个结点存多个字符
          struct StringNode * next;
      }StringNode,*String;
      

4.2 模式匹配

4.2.1 朴素模式匹配算法

在这里插入图片描述

// 使用基本操作
int Index(SString S,SString T){
    int i = 1,n = StrLength(S), m = StrLength(T);
    SString sub;
    while(i <= n - m + 1){	// 最多对比 n-m+1 个子串
        SubString(sub,S,i,m);	// 取出从位置i开始,长度为m的子串
        if(StringCompare(Sub,T)!=0)
            ++i;
        else
            return i;
    }
    return 0;
}
// 不使用基本操作
// 时间复杂度:O(S.length * T.length)
int Index(SString S,SString T){
    int i = 1, j = 1;
    while(i <= S.length && j <= T.length){
        if(S.ch[i] == T.ch[j]){
            ++i; ++j;
        }
        else{
            i = i - j + 2;
            j = 1;
        }
    }
    if(j > T.length)
        return i - T.length;
    else
        return 0;
}

4.2.2 KMP算法

在这里插入图片描述
在这里插入图片描述

4.2.3 KMP算法的进一步优化

在这里插入图片描述

nextval[1] = 0;
for(int j = 2;j <= T.length; j++){
    if(T.ch[next[j]] == T.ch[j])
        nextval[j] = nextval[next[j]];
    else
        nextval[j] = next[j];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ll._.ll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值