定义
串是由零个或者多个字符组成的有限序列,又名叫字符串
串中的字符数目n称为串的长度,
零个字符的串称为空串
串的比较
如silly和stupid,第一个字母都是s,我们认为不存在大小差异,而第二个字母,由于i字母比t字母要靠前,所以i<t,于是,我们说silly<stupid
事实上,串的比较是通过组成串的字符之间的编码来进行比较的。字符的编码指的是字符在对应字符集中的序号
常用的字符使用的标准是ASCII编码。共可以表示128个字符。
后来由于128个不够用,扩展的ASCII码由8位2进制表示一个字符,总共可以表示256个字符,这已经可以满足以英语为主的语言和特殊字符进行输入,存储,输出等操作的字符需要了。
但是我国的汉语,及很多少数名族的语言,显然256个字符远远不够,因此就有了unicode编码。比较常用的是由16位二进制数表示一个字符。约6.5万个字符,足够表示世界上所有语言的所有字符了。为了和ASCII兼容,Unicode的前256个字符与ASCII完全相同。
串的抽象数据类型
ADT 串
Data
串中元素仅由一个个字符组成,相邻元素具有前驱和后继关系
Operation
StrAssign(T,*chars): 生成一个其值等于字符串常量chars的串T
StrCopy(T,S): 若串S存在,由串S复制得到串T
ClearString(S): 若串S存在,则清空
StringEmpty(S):
StrLength()
StrCompare(S,T) :若S>T 返回>0 若S=T 返回0,若S<T 返回<0
ConCat(T,S1,S2) : 用T返回由S1和S2联接而成的新串
SubString(Sub,S,pos,len) 串S存在,pos,和len符合取值范围,用sub返回串S的第pos个字符起长度为len的子串
Index(S,T,pos): 串S和T存在,T是非空串,若主串S中存在和串T值相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置,否则返回0.
Replace(S,T,V): 若串S,T和V存在,T是非空串。用V替换主串S中出现的所有与T相等的不重叠的子串
StrInsert(S,pos,T)
StrDelete(S,pos,len)
串的存储结构
与顺序表一样,有两种存储方式:
顺序存储结构和链式存储结构
KMP模式匹配算法
朴素的匹配算法:
对主串的每一个字符作为子串的开头,与要匹配的字符串进行匹配。对主串做大循环,每个字符开头做需匹配长度的小循环,直到匹配成功或者全部遍历完成为止
实现算法:
功能:返回字串T在主串S中第pos个字符之后的位置,若不存在,则函数返回值为0
int Index(char*S,char *T)
{
int i,j;
//直到遍历主串完成或者需匹配字符串全部匹配成功
for(i=0,j=0;i<(int)strlen(S)&&j<(int)strlen(T);)
{
if(S[i]==T[j])
{
i++;
j++;
}
else {
//如果当前字符不同,则主串进行回溯,跳转到当前匹配首位的下一位
i=i-j+1;
j=0;
}
}
if(j==(int)strlen(T))
{
return i-j+1;
}
else {
return -1;
}
}
KMP匹配算法:
关于KMP算法的介绍参考这篇文章:
https://blog.csdn.net/LunaW/article/details/78783720