有一说一,我看上交的考纲里面似乎没有;说实话考研对于字符串也没啥好考的,他就只能出个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为模式串与主串的长度;

 posted on 2021-06-17 19:27  mappleyan  阅读(79)  评论(0编辑  收藏  举报