一。串(String)零个或多个任意字符组成的有限序列

1.

子串:一个串中任意个连续字符组成的子序列(含空串)称为该串的子串。

主串:包含子串的串相应地称为主串

字符位置:字符在序列中的序号为该字符在串中的位置

子串位置:子串第一个字符在主串中的位置

空格串:由一个或多个空格组成的串,与空串不同

串相等:当且仅当两个串的长度相等并且各个对应位置上的字符都相同时,这两个串才是相等的。


案例引入

​串的应用非常广泛,计算机_上的非数值处理的对象大部分是

字符串数据,例如:文字编辑、符号处理、各种信息处理系统等等。


【案例4.1】 :病毒感染检测

●研究者将人的DNA和病毒DNA均表示成由一些字母组成的字符串序列。

然后检测某种病毒DNA序列是否在患者的DNA序列中出现过,如果出现过,则此人感染了该病毒,否则没有感染。例如:假设病毒的DNA序列为baa,患者1的DNA序列为aaabbba,则感染,患者2的DNA序列为babbba,则未感染。(注意,人的DNA序列是线性的,而病毒的DNA序列是环状的)


2.串的类型定义,储存结构及运算

ADT String {

数据对象:

D = {a;| a;∈CharacterSet,i = 1,2..,n, n≥0}

数据关系:

R = {< a;1,a;>| a;_1,a; ∈D,i= 1,2,...,n}

基本操作:

(1) StrAssign (&T,chars)//串赋值

(2) StrCompare (S,J)一O//串比较

(3) StrLength (S)//求串长

(4) Concat(&T,S1,S2)//串连结

(5) SubString(&Sub,S,pos,len)//求子串

(6) StrCopy(&T,S)//串拷贝

(7) StrEmpty(S)//串判空

(8) ClearString (&S)//清空串

(9) Index(S,T,pos)//子串的位置

(11) Replace(&S,T,V)//串替换

(12) StrInsert(&S,pos,T)//子串插入

(12) StrDelete(&S,pos,len)//子串删除

(13) DestroyString(&S)//串销毁

}ADT String 


3.顺序串

​#define MAXLEN 255

typedef struct

{char ch[MAXLEN + 1];

int length;//串的当前长度

}SString;

4.串的链式存储结构

​可将多个字符存放在一个结点中, 以克服储存密度低的问题


串的链式存储结构----块链结构


#define CHUNKSIZE 50  //块的大小可自定义

typedef struct Chunk
{
char ch[CHUNKSIZE];
struct Chunk* next;

}Chunk;

typedef struct
{
Chunk * head;//串的头指针
Chunk * tail;//串的尾指针
int curlen;//串的当前长度
}LString; //字符串的块链结构



5.串的模式匹配算法

​算法目的:确定主串中所含子串(模式串)第一次出现的位置(定位)

算法应用:(搜索引擎、拼写检查、语言翻译、数据压缩

算法种类:

●BE算法(Brute-Force, 又称古典的、经典的、朴素的、穷举的)

●KMP算法(特点:速度快)


5.1●BF算法

​算法的思路是从主串S的每一个字符开始依次与模式串T的字符进行匹配。

#define MAXLEN 255
typedef struct
{
char ch[MAXLEN + 1];
int length;//串的当前长度
}SString;
int Index_BF(SString S, SString T, int pos)
{
int i = pos;//第pos个元素开始遍历匹配
int 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;
}
}

BF算法的时间复杂度:最坏的情况 (n-m)m+m ->(n-m+1)m

=>如果m<<n 则算法复杂度为:O(n*m)。

5.2   KMP算法


0