王道数据结构笔记
第四章 串
4.1串的定义和基本操作
串的定义:串,即字符串,它是由零个或多个字符组成的有限序列。
串是一种特殊的线性表,数据元素之间呈线性关系,
串中字符的个数n称为串的长度。
n = 0时的串称为空串(用∅表示)。
子串:串中任意个连续的字符组成的子序列。
主串:包含子串的串。
字符在主串中的位置:字符在串中的序号。
子串在主串中的位置:子串的第一个字符在主串中的位置 。
注意:
(1)串的位序从1开始而不是从0开始的。
(2)有的地方串用双引号(如Java、C),有的地方用单引号(如Python)。
(3)空格串不等于空串。
串的基本操作
串的数据对象限定为字符集(如中文字符、英文字符、数字字符、标点字符等)。
串的基本操作包括增、删、改、查等通常以子串为操作对象。StrAssign(&T,chars):赋值操作。把串T赋值为chars。
StrCopy(&T,S):复制操作。由串S复制得到串T。
StrEmpty(S):判空操作。若S为空串,则返回TRUE,否则返回FALSE。
StrLength(S):求串长。返回串S的元素个数。
ClearString(&S):清空操作。将S清为空串。
DestroyString(&S):销毁串。将串S销毁(回收存储空间)。
Concat(&T,S1,S2):串联接。用T返回由S1和S2联接而成的新串
SubString(&Sub,S,pos,len):求子串。用Sub返回串S的第pos个字符起长度为len的子串。
Index(S,T):定位操作。若主串S中存在与串T值相同的子串,则返回它在主串S中第一次出现的
位置;否则函数值为0。
StrCompare(S,T):比较操作。若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0。
4.2 串的存储结构
顺序存储
//静态数组
#define MAXSIZE 255
typedef struct{
char ch[MAXSIZE];
int length;
}SString;
//动态数组
typedef struct{
char *ch;
int length;
}SString;
SString S;
S.ch = (char*)malloc(sizeof(char)*MAXSIZE);
S.length=0;
链式存储
typedef struct LinkStringNode{
char ch;
struct LinkStringNode *next;
}LinkStringNode;
4.3 朴素模式匹配法
算法思想:将主串中与模式串长度相同的子串搞出来,将主串挨个与模式串对比当子串与模式串某个对应字符不匹配时,就立即放弃当前子串,转而检索下一个子串。
//i需要回溯
Int BIndex(char *S,char *T){
int i=1,j=1;
while(i<S=S.length&&j<=T.length){
if(S.data[i]==T.data[j]){
i++;j++;
}
else{
i=i-j+2;
j=1;
}
}
if(j>T.length){
return i-T.length;
}
else return false;
}
4.4 KMP算法
在学习该算法之前首先要了解串前缀和后缀的概念。
串的前缀:包含第一个字符,且不包含最后一个字符的子串。
串的后缀:包含最后一个字符,且不包含第一个字符的子串。
当第j个字符匹配失败,由前 1~j-1 个字符组成的串记为S,则:
next[j]= S的最长相等前后缀长度+1。特别地,next[1]=0
在求next 数组时,若模式串的第 j 个字符匹配失败,则令模式串跳到 next[j] 再继续匹配。
//j需要回溯
char Get_Next(char *T,char *(&next)){
int i=1,j=0;
next[1]=0;
while(i<T.lenth){
if(T.data[i]==T.data[j]||j==0){
i++;j++;
next[i]=j;//求得第i+1个字符的next值
}
else{
j=next[j];//j回溯
}
}
}
Int KMPIndex(char *S,char *T){
int i=1,j=1;
char *next=(int *)malloc(sizeof(int)*T.length);
Get_Next(T,next);
while(i<=S.length&&j<=T.length){
if(S.data[i]==T.data[j]||j==0){
i++;
j++;
}
else{
j=next[j];//若T.data[i]不等于T.data[next[j]],则j回溯,继续匹配
}
}
if(j>T.length){
return i-T.length;
}
else return 0;
}