一.串的定义:
串(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函数序列方法:略