//串:它是有限字符集中的零个或多个字符组成的有限序列 //一种特殊的线性表 int indexz(String S,String T,int pos) { //T为非空串,若主串S中第pos个字符之后存在与T相等 //的子串,则返回第一个这样的子串在S中的位置 if(pos>0) { n=StrLength(S);//求出主字符串的长度 m=StrLength(T);//求出非空串的长度 i=pos; while(i<=n-m+1) { SubString(sub,S,i,m); if(StrCompare(sub,T)!=0)//依次让非空串和主串比较是否相等 i++;//如果不等,让非空串在主串上移动一位 else return i;//如果找到相同的,就返回主串中的位置 } } return 0; } //1.定义串的定长 #define MAXSTRLEN 255//用户可在255内定义最大串长 Typedef unsigned char Sstring[MAXSTRLEN+1];//0号单元存放串的长度 //2.串链接:用T返回由S1和S2链接而成的新串,若未截断,返回TRUE Status Concat(SString &T,SString S1,SString S2) { if(S1[0]+S2[0]<=MAXSTRLEN)//如果两个串长度之和小于新串T的长度 { T[1...S1[0]=S1[1..S1[0]];//S1[0]表示最后一个元素,把S1中所有元素赋到T中 T[S1[0]+1..S1[0]+S2[0]]=S2[1...S2[0]];//把S2中元素赋到S1元素+1后面,正好链接 T[0]=S1[0]+S2[0];//最后T串长度就是两个串长度之和 uncut=TRUE;//没有被截断 } else if(S1[0]<MAXSTRSIZE) //第二种情况,S1长度小于T,但S1+S2大于T,这样,S1完全插入,而S2没有完全 { T[1..S1[0]=S1[1...S1[0]];//把S1中的元素都赋到T中 T[S1[0]+1...MAXSTRLEN]=S2[1..MAXSTRLEN-S1[0]];//把S2中部分元素链接到S1后面 T[0]=MAXSTRLEN;//T的长度等于开始T的分配 长度 uncut=FALSE;//串被截断 } else //第三种情况,串T等于串S1的长度。 { T[0...MAXSTRLEN]=S1[0...MAXSTRLEN];//把S1所有元素赋到T中 uncut=FALSE;//被截断 } return uncut; } //3.求子串的函数 //用Sub返回串S的第POS个字符起长度为Len的子串 //1<=pos<=StrLength(s)且0<=len<=StrLength(S)-pos+1 Status SubString(Sstring &Sub,SString S,int pos,int len) { if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)//如果pos不合法或者长度溢出, return ERROR;//返回错误 Sub[1..len]=S[pos..pos+len-1];//把符合情况的子串赋给新串 Sub[0]=len;//Sub[0]用来存放数组的长度 return OK; } //4。子串匹配算法。:返回子串T在主串S中第POS个字符之后的位置, //若不存在,返回0 { i=pos;//i为主串的移动指针 j=1;//J为在子串上移动的指针 while(i<=S[0]&&j<=T[0])//如果两个指针都小于各自的最大长度 { if(S[i]==T[j])//如果比较时候相等 { i++;//让主串指针移动到下一个位置 j++;//子串指针也移动到下一位置 } else { i=i-j+2;//回溯,就是让主串指针回到最后比较的下一位,最为比较起点 j=1;//让子串让从头开始与主串比较 } } if(j>T[0])//当子串指针移动到最后仍然相等,那就返回其位置,说明找到 return i-T[0]; else return 0; } //5.串置换:将串"S"中所有子串"T"的出现都换成"v" //在S中定位t,然后根据t和v二者的长度; t.curlen<v.curlen:后移动v.curlen-t.curlen t.curlen=v.curlen:替换 t.curlen>v.curlen:前移动t.curlen-v.curlen //重复,直到s中不存在t为止
时间: 2024-10-13 19:08:00