空串:长度为0的串

空格串:由一个或多个空格组成的串

串常用的3种机内表示方法:

定长顺序存储表示

用一组地址连续的存储单元存储串的字符序列,每一个串变量都有一个固定长度的存储区,可用定长数组来描述。

#define MAXLEN 255

typedef unsigned char Sstring[MAXLEN+];/*0号单元存放串的长度*/

1.串连接

当串s1,s2连接后的结果串t超过了定长MAXLEN时,即s1[0]+s2[0]>MAXLEN,输出相应的信息

void Concat(Sstring t,Sstring s1,Sstring s2)
{/*将s1串和s2串连接后存入t串中*/
int i,j;
int m,n;
m = s1[],n = s2[];
if(m + n > MANXLEN)
printf("两串连接后超过串的定长!\n");
else{
for(i = ;i <= m;i++) t[i] = s1[i];
for(j = ;j <= n;j++) t[i+j] = s2[j];
t[] = m + n; /*将两串连接后的长度存至t[0]中*/
}
}

2.求子串

设子串的起始位置为pos,子串的长度为len

当pos<1或pos>s[0]时,子串位置非法;

当len<0或len>s[0]-pos+1时,子串长度非法。

void SubString(Sstring sub,Sstring s,int pos,int len)
{/*将s中序号pos起len个字符复制到sub中*/
int i;
if(pos<||pos>s[]||len<||len>s[]-pos+)
printf("子串的开始位置或长度错误!\n");
else{
for(i = ;i <= len; i++)
sub[i] = s[i+pos-];
sub[] = len;
}
}

堆分配存储表示:

仍用一组地址连续的存储单元存放串的字符序列,但每个串的存储空间是在程序执行过程中动态分配而得。

堆空间:存放所有串可利用的空间

heap[MAXSIZE]表示堆空间,free指向heap中未分配区域的开始地址,初始化为0

/*====堆分配存储====*/
typedef struct{
char *ch; //串的起始地址
int len; //串的长度
} HSt

1.串连接

void Concat(HString * t,HString * s1,HString * s2)
{/*将s1,s2连接后,存入t串,返回t串*/
int i;
if(t->ch) free(t->ch);//如果串t已存在,先释放掉旧空间
if(!(t->ch=(char *)malloc((s1->len+s2->len)*sizeof(char))))
printf("溢出错误\n");//分配空间失败
else{
for(i=;i<s1->len;i++)
t->ch[i]=s1->ch[i];
for(i=;i<s2->len;i++)
t->ch[i+s1->len]=s2->ch[i];
t->len=s1->len+s2->len;
}
}

2.求子串

void SubString(HString * sub,HString * s,int pos,int len)
{//将s中从pos个位置起的len个字符复制到sub中
int i;
if(pos<||pos>=s->len||len<||len>s->len-pos+)
printf("子串的开始位置或长度错误!\n");
if(sub->ch) free(t->ch);//如果串t已存在,释放旧空间
if(!len) {sub->ch=NULL;sub->len=;}//如果子串为空串
else{
for(i = ;i <len;i++)
sub->ch[i]=s->ch[i+pos];
sub->len=len;
}
}

串的块链存储表示:

可采用链表方式存储串值

#define CHUNKSIZE 80
typedef struct Chunk{
char ch[CHUNKSIZE];
struct Chunk * next;
}Chunk;
typedef struct {
Chunk * head, * tail;
int len;
}LString;

模式匹配:

简单的模式匹配:时间复杂度O(n×m) 效率低,时间主要浪费在指针的回溯上

着重来讲一下

KMP:主要消除了主串指示器变量i的回溯,时间复杂度为O(m+n)

数据结构——串(KMP)的更多相关文章

  1. 基础数据结构-串-KMP算法

    KMP算法用于模式串字符匹配,因为没有提前预习,上课时听得云里雾里,后来回去看了一晚上,翻了一些网上的讲解才理解了.我简单讲一下,我们在一串字符串A里搜索匹配另一段字符串B时,思路最简单方法的就是从第 ...

  2. 数据结构- 串的模式匹配算法:BF和 KMP算法

      数据结构- 串的模式匹配算法:BF和 KMP算法  Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...

  3. [从今天开始修炼数据结构]串、KMP模式匹配算法

    [从今天开始修炼数据结构]基本概念 [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList [从今天开始修炼数据结构]栈.斐波那契数列.逆波兰四则运 ...

  4. 浅谈数据结构之KMP(串中的模式匹配算法)

    KMP算法是一种模式匹配算法的改进版,其通过减少匹配的次数以及使主串不回朔来减少字符串匹配的次数,从而较少算法的相应代价,但是,事件万物是普遍归中的,KMP算法的有效性也是有一定的局限的,我将在本文的 ...

  5. 数据结构(三)串---KMP模式匹配算法实现及优化

    KMP算法实现 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include ...

  6. 数据结构(三)串---KMP模式匹配算法之获取next数组

    (一)获取模式串T的next数组值 1.回顾 我们所知道的KMP算法next数组的作用 next[j]表示当前模式串T的j下标对目标串S的i值失配时,我们应该使用模式串的下标为next[j]接着去和目 ...

  7. 数据结构(三)串---KMP模式匹配算法

    (一)定义 由于BF模式匹配算法的低效(有太多不必要的回溯和匹配),于是某三个前辈发表了一个模式匹配算法,可以大大避免重复遍历的情况,称之为克努特-莫里斯-普拉特算法,简称KMP算法 (二)KMP算法 ...

  8. 数据结构——串的朴素模式和KMP匹配算法

    一.朴素模式 假设我们要从主串S="goodgoogle"中找到子串T="google"的位置,步骤如下: i表示主串的当前位置下标,j表示子串的当前位置下标, ...

  9. 【数据结构】KMP算法

    我还是不太懂... 转2篇大神的解释    1>https://www.cnblogs.com/yjiyjige/p/3263858.html     2>https://blog.csd ...

随机推荐

  1. 【druid 】数据库连接池-sql解析

    https://segmentfault.com/a/1190000008120254?utm_source=tuicool&utm_medium=referral sql解析 Druid 的 ...

  2. ifconfig 网卡 下面的参数

    ifconfig  eth1 eth1 Link encap:Ethernet HWaddr 20:12:07:04:05:00 inet addr:172.16.77.174 Bcast:172.1 ...

  3. VBA随机地牢生成

    无聊啊--于是,我想做一个随机地图. 但是我很懒,不想做. 但是身体很诚实. 这次是直接在Excel中制作的地图,但是,VB的执行效率很慢,我代码的效率也很慢,导致,一旦地图长宽稍大,就会出现好几分钟 ...

  4. 通过Spark Streaming的foreachRDD把处理后的数据写入外部存储系统中

    转载自:http://blog.csdn.net/erfucun/article/details/52312682 本博文主要内容包括: 技术实现foreachRDD与foreachPartition ...

  5. MQTT研究之EMQ:【SSL双向验证】

    EMQ是当前MQTT中,用于物联网领域中比较出色的一个broker,今天我这里要记录和分享的是关于SSL安全通信的配置和注意细节. 环境: 1. 单台Linux CentOS7.2系统,安装一个EMQ ...

  6. 如何在本地同时管理github仓库和codingnet仓库?

    本文的前提条件是你在电脑上接入了github或者gitlab的仓库,现在要接入codingnet的仓库. 电脑上已经有了 github 的 ssh key,怎么继续接入codingnet 的git仓库 ...

  7. SX_WIN10X64LTSB2016_EN_LITE英文精简版

    SX_WIN10X64LTSB2016_EN_LITE英文精简版该版本为英文版!该版本为英文版!该版本为英文版!因为论坛巴基斯坦的maanu兄弟PM我,所以抽空做了一个.介绍沿用原来的,中文用谷歌翻译 ...

  8. win10 vs2015源码编译tesseract4.0

    1.安装软件 cmake  下载地址 cppan   下载地址 安装完毕后,需要将cmake.exe和cppan.exe加入环境变量PATH中 cmake简介 CMake全称为“cross platf ...

  9. Ubuntu平台rm误删的文件如何恢复

    安装:Ubuntu下也可以直接用apt-get来获取extundelete 以我自己的Ubuntu14.04.3来看: df 命令是linux系统上以磁盘分区为单位来查看文件系统的命令,后面可以加上不 ...

  10. Cleanmymac X好不好用?

    Cleanmymac X是一款Mac清理软件,能够帮助我们快速实现快速实现磁盘清理,是mac用户的智能助手.那么为什么大家会认定它并坚定不移呢?小编带你感受感受. 1. 简洁大气的外观. 用户正版官方 ...