定义
串:是由0个或多个字符组成的有限序列,又叫字符串。S=‘a1a2…an’(n>=0)
空串:长度n=0的串,不包含任何字符。
空格串:是仅由一个或多个空格组成的串,长度>=1。
子串:串中任意个连续的字符组成的子序列。
主串:包含子串的串相应的称为主串。
位置:字符在序列中的序号,子串在主串中的位置则以子串的第一个字符在主串中的位置来表示。
相等:两个串的长度相等,并且对应位置的字符都相等。
串的存储结构
对串的存储方式取决于我们对串所进行的运算,如果在程序设计语言中,串的运算只是作为输入或输出的常量出现,则此时只需存储该串的字符序列,这就是串值的存储。此外,一个字符序列还可赋给一个串变量,操作运算时通过串变量名访问串值。
对于串的存储可以有两种处理方式:一是可以将串定义为字符型数组,数组名就是串名,串的存储空间分配在编译时完成,程序运行时不能更改。这种方式为串的静态存储结构。另一种是定义字符指针变量,存储串值的首地址,通过字符指针变量名访问串值,串的存储空间分配是在程序运行时动态分配的,这种方式称为串的动态存储结构。
静态存储采用顺序存储结构,动态存储采用的是链式存储和堆存储结构。
详细可见https://wenku.baidu.com/view/ed30c857c5da50e2524d7fb5.html
基本操作
串插入StrInsert(S,pos,T)
初始条件:串S和T存在,1<=pos<=StrLength(S)+1。
操作结果:在串S的下标为pos的字符之前插入串T。
例如:S=‘chater’,T=‘rac’,执行StrInsert(S,4,T)之后S=‘character’。
串删除StrDelete(S,pos,len)
初始条件:串S存在,1<=pos<=Length(S),且0<=len<=Length(S)-pos+1。
操作结果:从串S中删除 下标为pos的字符起 长度为len的子串。
例如:S=‘chapter’,执行StrDelete(S,5,3)之后S=‘chap’。
S=‘chapter’,执行StrDelete(S,5,4)是bug
串连接StrCat(S,T)
初始条件:串S和T存在。
操作结果:返回由S和T连接而成的新串。
例如:S=‘man’,执行StrCat(S,‘kind’)之后S=‘mankind’
求子串SubString(Sub,S,pos,len)
初始条件:S存在,1<=pos<=Length(S) 且 0<=len<=Length(S)-pos+1(pos+len-1<=Length(S))。
操作结果:用Sub返回串S的第pos个字符起长度为len的子串。
例如:SubString(sub1,‘commander’,4,3) sub1=‘man’
求位置StrIndex(S,pos,T)
初始条件:主串S和T存在,T是非空串。
操作结果:若主串S中存在和串T值相同的子串,则返回它在主串S中从第pos个字符开始第一次出现的位置;否则函数值为0。
例如:S=‘abacsdacs’,执行StrIndex(S,2,‘acs’)返回3
串替换StrReplace(S,T,V)
初始条件:串S,T,V均存在,且T是非空串。
操作结果:用串V替换主串S中出现的所有与T相等的不重叠的子串。
例如:S=‘abcaabcaaa’,T=‘bca’,V=‘x’,执行之后S=‘axaxaa’
串的模式匹配
BF模式匹配算法
主串S中的子串与模式串T进行从前到后依次比较,直到找到相同的子串为止,返回子串在主串中的位置pos,否则匹配不成功。时间复杂度为O(m*n)。
BF算法思想是:将S中的第一个字符与T中的第一个符进行比较,若不同,就将S中的第二个字符与T中的第一个字符进行比较,…直到S的某一个字符和T的第一个字符相同;再将它们之后的字符进行比较,若也相同,则如此继续往下比较;依此类推,重复上述过程。
int Index(SString S,SString T){
int i=pos,j=1;
while(i<=S.len && j<