简介: 串(String)—–零个或多个字符组成的有限序列 a="beijinghuanyingni"b="beijinghuanying"c="beijin"d=""子串:串中任意个连续的字符组成的子序列称为该串的子串。

串(String)—–零个或多个字符组成的有限序列
串的示意图

a="beijinghuanyingni"
b="beijinghuanying"
c="beijin"
d=""

子串:串中任意个连续的字符组成的子序列称为该串的子串。
比如上面的b是a的子串、c是a或者b的子串。
空串:零个字符的串。注意是”“而不是” “。空串是任意串的子串,任意串是其自身的子串。
串的抽象数据类型
ADT String{
数据对象: D={ai|ai∈CharacterSet,i=1,2,…,n,n≥0}
数据关系:R1={ <\ai-1,ai>|ai-1,ai-1,ai∈D,i=2,…,n}
StrAssign(T,*chars): 生成一个其值等于字符常量chars的串T.

      StrCopy(T,S):     串S存在,由S复制得到T.

      ClearString(S):    串S存在,将串清空.

      StringEmpty(S):    若串为空,返回true,否则返回false.

      StrLentgth(S) :    返回串S的元素个数,即串的长度.

      StrCompare(S,L):    比较S和T,若S>T,返回>0,S==T返回0,
      S

      SubString(Sub, S, pos, len): 串S存在,1<=pos<=StrLentgth(S),且 0<=len<=StrLentgth(S)-pos+1,用Sub返回串S的第pos个起

                     长度为len的子串.

      Index(S,T,pos)

      Replace(S,T,V)     串S,T,V存在,T是非空串,用V替换S中出现的所有与T相等的不重叠的子串.

      StrInsert(S,T,pos): 在串S的第pos个字符之前插入串T.

      StrDelete(S,pos,len): 从串S中删除第pos个字符起的长度为len的子串.
}
串的存储结构

  • 顺序存储
  • 链式存储
    顺序存储表示
    typedef struct{
    char *ch;//若串非空,则按照串长分配存储区,否则ch为NULL
    int length;//串长度
    }String;
    链式存储表示#define CHUNKSIZE 80
    typedef struct Chunk{
    char ch[CHUNKSIZE];
    struct Chunk *next;
    }Chunk;
    typedef struct{
    Chunk *head,*tail;
    int curled;
    }String;
    链式存储优点:操作方便
    缺点:存储密度较低
    存储密度=串值所占的存储位/实际分配的存储位

BF算法
BF(Brute-Force)算法的基本思路:
1)从目标串s的第一个字符起和模式串的第一个字符进行比较,若相等。则继续逐个比较后续字符,否则从串s的第二个字符起再重新和串t进行比较。
2)依次类推,直至串t中的每个字符依次和串s的一个连续的字符序列相等,则模式匹配成功,此时串t的第一个字符在串s的位置就是t在s中的位置,否则模式匹配不成功。
BF算法匹配过程

#include <stdio.h>
#include "stdlib.h"
//宏定义
#define TRUE   1
#define FALSE   0
#define OK    1
#define ERROR   0
#define  MAXSTRLEN 100
typedef char    SString[MAXSTRLEN + 1];
//返回子串T在主串S中第pos位置之后的位置,若不存在,返回0
 int BFindex(SString S, SString T, int pos)
{
if (pos <1 ||  pos > S[0] ) exit(ERROR);
int i = pos, j =1;
while (i<= S[0] && j <= T[0])
{
    if (S[i] == T[j])
    {
        ++i; ++j;
    } else {
        i = i- j+ 2;
        j = 1;
    }
}
if(j > T[0]) return i - T[0];
return ERROR;
}
void main(){
SString S = {13,'a','b','a','b','c','a','b','c','a','c','b','a','b'};
SString T = {5,'a','b','c','a','c'};
int pos;
pos = BFindex( S,  T, 1);
printf("%d",pos);
}

BF算法特点:
通过上面的例子可以看到BF算法思路直接简明。但当匹配失败时,主串的指针i总是要回到i-j+2位置,模式串的指针总是恢复到首字符的位置j=1,因此,算法时间复杂度高。
KMP算法
KMP算法是改进了BF算法,小编对这个算法也是似懂非懂,今后学习后会为大家讲解

相关文章
|
Java 存储 jvm-sandbox
海量流量下,淘宝如何进行稳定的流量回放?
随着业务的不断发展, 整个淘系的服务端已经有数千个应用,在淘宝已经有非常大的应用数量和变更次数的基础上, 对流量回放也有更高的要求。那么在不断尝试流量的录制与回放的过程中,我们遇到了什么问题?那么在不断尝试的过程中,我们遇到了什么问题?我们由从中得到了什么启示?流量录制回放又能给我们带来多少收益?
10393 1
|
人工智能 弹性计算 算法
【云故事探索】NO.5:PETKIT小佩,科技与爱,共绘宠物智能生活新篇章
在数字化浪潮中,中国宠物行业蓬勃发展,国内养宠规模已超2亿,形成千亿市场。成立于2013年的PETKIT小佩,专注智能宠物用品,服务遍布40+国家。面对618、双11等高峰挑战,阿里云ECS弹性扩容助其稳定运行。借助阿里云全球化部署能力,小佩成功出海。最新可视喂食器结合AI算法与OSS存储,提升用户体验。未来,双方将进一步探索AI大模型在宠物行业的应用,持续优化养宠体验。
|
7月前
|
Oracle 关系型数据库 网络安全
崖山异构数据库迁移利器YMP初体验-Oracle迁移YashanDB
文章是作者小草对崖山异构数据库迁移利器 YMP 的初体验分享,包括背景、YMP 简介、体验环境说明、YMP 部署(含安装前准备、安装、卸载、启动与停止)、数据迁移及遇到的问题与解决过程。重点介绍了 YMP 功能、部署的诸多细节和数据迁移流程,还提到了安装和迁移中遇到的问题及解决办法。
|
安全 网络安全 算法框架/工具
SSH高版本连接问题排查
【6月更文挑战第21天】SSH高版本连接问题排查
962 0
|
Java 应用服务中间件 微服务
spring boot 中Feign调用提示Request header is too large 解决方案
spring boot 中Feign调用提示Request header is too large 解决方案
811 1
|
Web App开发 编解码 固态存储
camtasia有效密钥2022有哪些?
camtasia有效密钥2022有哪些?camtasia是TechSmith旗下一款专门录制屏幕动作的工具,这款软件是一款付费软件,用户需要激活密钥才可以激活,所以很多的用户都在网上求有效的密钥,所以下面小编就给大家带来camtasia有效密钥2022通用有效。
12297 2
camtasia有效密钥2022有哪些?
|
应用服务中间件 Shell 网络安全
Docker实战:Docker安装nginx并配置SSL
今天继续给大家分享Docker实战,Centos8环境下安装nginx并配置SSL。
Docker实战:Docker安装nginx并配置SSL
农场养成种树游戏开发逻辑源码解析
开发一个农场养成种树游戏可以为玩家提供种植和养护树木的体验,同时也可以学习有关农业和环境保护的知识。 以下是一个简单的农场养成种树游戏的开发源码demo,供参考:
|
关系型数据库 MySQL BI
mysql中left join的误解及笛卡尔积解释
mysql中left join的误解及笛卡尔积解释
789 0
mysql中left join的误解及笛卡尔积解释
|
机器学习/深度学习 传感器 数据库
免费的机器学习数据集网站(6300+数据集
免费的机器学习数据集网站(6300+数据集
485 0
免费的机器学习数据集网站(6300+数据集