一.串的定义:

串(String)是字符串的简称,是由零或多个字符串组成的有限序列。一般记为:S="a1a2a3...an"(n>=0)

(1)其中S是串名

(2)用双引号括起来的是串的值。

 

二.什么是子串,什么是主串,怎么比较两个子串相等,怎么计算一个窜的子串。

(1)串中任意个连续字符组成的子序列称为改串的子串。

(2)包含子串的串称为该子串的主串,

(3)当且仅当两个串的长度相等,并且各个对于位置的字符也同时相等,称两个串相等的。

(4)非空子串计算:n(n+1)/2;子串计算:n(n+1)/2+1;

 

三.串的基本操作:

(1)求串长Strlen(s):求串长。

(2)串赋值StringAssign(s,string_constant):给串赋值。string_constant是变量或者常量。

(3)串复制Strcpy(s,t):复制s串得到t串。

(4)串连接Strcat(s,t):把串t连接到s串末尾,形成新串。

(5)串比较Strcmp(s,t):比较s与t大小,s<t返回值小于0,....

(6)求子串SubStr(s,pos,len,sub):

(7)子串的定位Index(s,t):在串s中找t串,找到第一次出现位置。

(8)串插入StrInsert(s,pos,t):把串t插入到串s的pos位置。

(9)串删除StrDelete(s,pos,t):...

(10)子串替换Replace(s,t,v):将串t真的子串t全部替换成串v。

 

四.串的定长顺序储存结构表示:串的顺序储存结构,简称顺序串。储存举例。操作举例略。

# define MaxSize 256
typedef char SeqString[MaxStrSize]
SesString S;

判断串结尾一般用‘\0’

五.串的堆储存结构表示:堆储存结构的特点是,仍以一组空间足够大的,地址连续的存储单元存放串字符序列,但改存储空间的大小表示预定义的,而是在程序执行过程中动态分配。储存举例。操作举例略。

type struct{
    char *ch;    /*ch指向串起始位置*/
    int length;   /*串的实际长度*/
}Hstring;

实现通过malloc() ,free() ,realloc等函数实现。

 

六.串的链存储结构:串可以用链式存储方法表示,串的链式存储结构简称链串,链串的类型定义和单表类型。储存举例。操作举例略。

typedef struct{
    char ch;
    struct cnode *next;
}cnode,*LinkString;
LinkString head; /*head是链串的头指针*/

块链存储结构(链式存储的改进):在链串的每个节点存放多个字符,这样节点叫快,每个节点所容纳字数为块的大小,同时称这样的串存储结构为块链存储。储存举例。操作举例略。

# define CHUNKSIZE=4    /*定义块大小*/
typedef struct Chunk{   /*定义块链节点结构*/   
    char str[CHUNKSIZE];
    struct Chunk *next;
}Chunk;

typedef struct{        /*定义块链存储结构*/
    Chunk *head,tail;    /*链表头指针和尾指针*/
    int strlen;        /*串的实际长度*/
}Lstring;

七.kmp匹配算法:

next函数定义:当j=0;next[j]=0;next[j]=max{k|1<k<j且“t(1)t(2)t(3)...tk-1”=t(j-k+1)t(j-k+2)...t(j-1)};next[j]=1,其他。

(1)next函数算法(这个是逆向求next值):

Void get_next(SeqString t,int next[])
{
    int i=1,j=0;
    next[1]=0;
    while(i<t.length)
        if(j==0||t.ch[i]==t.ch[j])
            {++i;++j;next[i]=j;}
        else j=next[j];
}

(2)Kmp算法:略

(3)直接求next函数序列方法:略

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值