串
有一说一,我看上交的考纲里面似乎没有;说实话考研对于字符串也没啥好考的,他就只能出个KMP的原理,求解一下next或者nextval数组啥的,毕竟kmp也不能考大题,谁没事写模板去,复杂一点的自动机他也不能在考研里面出现。。。
1、关于串的定义
简单来说串就是n个字符的有限序列,显然n≥0;
注:既然是字符,那空格什么的当然也算咯
2、串的存储结构
(1)定长顺序存储表示
跟线性表的顺序存储类似,均为事先开辟一段地址连续的存储单元存储串的字符序列,如:
#define MAXN 100//预定义最大长度
typedef struct{
unsigned char ch[MAXN];//
unsigned int length;//实际上串长
}SString;
显然,由于采取字符数组的存储,串长度只能小于等于MAXN;超过预定义长度的部分将自动被舍去,这就是截断。一般情况下在c字符数组中通常以“\0"为串的结束标志。
(2)堆分配存储表示
堆分配仍然是以一段地址连续的存储单元存储串的字符序列,但是跟定长顺序存储的区别就在于他不需要事先定义长度上限,而是在使用过程中动态分配
typedef struct{
unsigned char *ch;//若为非空串,则按串长分配存储区,否则ch为NULL
unsigned int length;//记录串长
}Hstring;
在c语言中,存在一个被称为“堆”的自由存储区,并由动态分配函数malloc()以及free()来进行管理;
(3)块链存储表示
听名字,显然是类似于线性表的链式存储结构,也可以使用链表。知道有这么个东西就行,暂且不必要探究他。
由于串的特殊性(每个元素只有一个字符),在具体实现时,每个结点可以存放一个或多个字符,这样的一个结点就称为块,而整个链表就被称为块链结构
3.串的基本操作函数
事实上俺觉得完全没必要记这些东西,俺不信谁机试或者写算法题不用string和cstring库!更不信会有学校机试手撕操作函数!
(1)ADT String
typedef struct{
unsigned char *ch;
unsigned int length;
}
(2)操作函数声明
Status StrAssign(HString &T,char *chars);//生成一个值等于串常量chars的串T
int StrLength(HString S);//返回S中字符个数即为串长度
int StrCompare(HString S,HString T);//比较串,若S>T返回值>0;若S=T,返回值=0;若S<T,返回值<0;
Status ClearString(HString &S);//将S置空并释放空间
Status Concat(HString &T,HString S1,HString S2);//用T返回S1拼接S2的复合串
HString SubString(HString S,int pos ,int len);//返回S的第pos个字符起长度为len的字串。
(3)实现//有空再补,反正也没用
4、串的模式匹配,KMP算法
什么叫模式匹配?简单讲就是子串定位,通俗的讲就是求解子串T在主串S中首次出现的位置;由于kmp算法个人理解不同,我直接介绍严蔚敏数据结构c语言版书上的方法,emmmm也就是是王道书上的那种,当然我不可能写个几页;
(1)暴力破!
int Index(SString S,SString T){
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(nm),n、m为模式串与主串的长度;