串的基本操作:
串的插入:
StrInstert(S,pos,T)
初始条件:串S和串T存在,0<pos<StrLength(S)。
操作结果:在串S下表为pos的字符前一个位置插入串T。
例如: S=“chater” ;T=“rac” ;执行StrInstert(S,4,T);后结果为:S=“character”;
串的删除:
StrDelete(S,pos,len);
初始条件:串S存在,1<=pos<=StrLength(S)+1。
操作结果:从串S中删除pos位置起,长度为len的子串。
例如: S=“character”;执行StrDelete(S,4,3);后结果为:
S=“chater”;
串的连接:
StrCat(S,T);
初始条件:串S和串T存在。
操作结果:返回一个由S和T连接而成的新串。
例如: StrCat(“man”,“kind”)=“mankind”;
求子串:
SubString(Sub,S,pos,len)
初始条件:串S存在,1<=pos<=Length(s)且1<=len<=Length(S)-pos+1;
操作结果:用Sub返回S串中pos位置开始长度为len的子串。
例如:SubString(sub1,“commander”,4,3);执行后sub1=“man”.
索引:
StrIndex(S,pos,T)
初始条件:串S和串T存在,T是非空串
操作结果:若主串S中存在和T相同的子串,则返回它在主串S中第pos个字符开始第一次出现的位置,否则函数值为0 。
例如:S=“abccdacb”; T=“bcc”;执行StrIndex(S,1,T)=2
替换:
StrReplace(S,T,V)
初始条件:串S、T、V均存在,且T为非空串。
操作结果:用V替换主串S中出现的所有的与T相等的不重叠的子串。
例:S=“abcaabcaaabca”;T=“bca”;V=“x”;
S=“axaxaax”;
串的存储结构:(1)定长顺序穿(2)堆串(3)块链串
串的模式匹配:
(1)简单匹配算法
主串S中的子串与模式串T进行比较,直到找到相同的子串为止。如果存在相同的子串,则匹配成功,返回子串在主串S中的位置pos。否则,匹配不成功。
比较策略:从前到后依次进行比较。
时间复杂度:O(m*n)。
int Index(SString S,int pos,SString T){
int i=pos,j=1;
while(i<S.len&&j<T.len){
if(S.ch[i]==T.ch[j]){
++i;
++j;
}
else{
i=i-j+2;
j=1;
}
}
if(j>T.len)
return i-T.len;
else
return 0;
}
(2)KMP算法
特点:不需要回溯主串S的i指针。且时间复杂度可以达到O(m+n)。
思想:从主串的第pos个位置开始与模式串的第一个字符进行比较。
相等:继续比较后续字符:i++;j++;
j==0:主串位置后移,和模式串首个字符开始比较;i++;j++;
不相等:主串位置不变,和模式串的第next[j]位置比较,j=next[j]。
int Index_KMP(SString S,int pos,SString T){
int i=pos,j=1;
while(i<S.len&&j<T.len){
if(j==0||S.ch[i]==T.ch[i]){
i++;
j++;
}
else
j=next[j];
}
if(j>T.len)
return i=T.len;
else
return 0;
}
next[j]的求法:
void Get_Next(SString S,int next[]){
int j=1,k=0;
next[1]=0;
while(j<T.len){
if(k==0||T.ch[j]==T.ch[k]){
j++;
k++;
next[j]=k;
}
else
k=next[k];
}
}
nextval求法: