数据结构——串(字符串)

一 串的定义和实现

1 定义

串是由零个或多个字符组成的有限序列,可以是字母,数字或者其他字符

由一个或多个空格组成的串称为空格串(空格也是一种符号)

如“hello world 232@#%^&”

2 串的存储结构

2.1 定长顺序存储表示
#define maxline 255
typedef struct
{
    char ch[maxline];
    int length;
}Sstring;

一组连续的存储单元

超过的长度会发生截断;一般字符串的结尾都有一个隐含的“\0”,不计入长度

在这里插入图片描述

2.2 堆分配存储表示

仍是一组连续的存储单元,但是存储空间是执行过程中动态分配的

typedef struct
{
    char *ch;
    int length;
}Hstring;
2.3 块链存储表示

每个结点可以存放一个字符,也可以存放多个字符

每个结点称为块,整个链表称为块链结构

最后一个结点占不满时通常用#补上

在这里插入图片描述

3 串的基本操作

Strassign(&T,chars);            \\T赋值到chars
Strcopy(&T,S);                  \\S复制到T
Strempty(S);                    \\判空
Strcompare(S,T);                \\比较ST,S>T返回值大于0
Strlength(S);                   \\求串长
Substring(&Sub,S,pos,len);      \\用sub返回s从pos位置长度为len的子串
Concat(&T,S1,S2);               \\T返回s1和s2的串接
Index(S,T);                     \\若S中存在T相同的子串,返回第一次出现的位置,否则为0
Clearstring(&S);                \\清空
Destroystring(&S);              \\销毁

二 串的模式匹配

1 简单的模式匹配算法

模式匹配:子串的定位操作,求的是子串在主串中的位置

采用定长顺序存储结构

暴力算法

int Index(Sstring S,Sstring R)
{
    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;              \\没找到
}

时间复杂段:O(mn),m,n分别是子串和主串的长度

算法思想:主串和子串的字符一一对比,如果不对,子串倒退到一开始,主串倒退到刚刚比较的的下一个位置

当子串为“00001”,主串为“0000000000000000000000001”时,可以预想到查找效率极低,需要匹配到最后一个位置才能找到

在这里插入图片描述

2 串的模式匹配算法——KMP算法

从刚刚的例子可以看出第四次和第五次是不需要进行的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

青山是哪个青山

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

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

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

打赏作者

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

抵扣说明:

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

余额充值