串替换:设串S="aqpbcderstbcdegh",子串T=“bcde",子串V="ff",实现子串V替代所有主串S中出现的和子串T相等的不重叠的子串,原主串S将由串S="aqpbcderstbcdegh",改变为S=“aqpffrstffgh"
算法思想:串的替换算法由以下几个步骤
(1)首先要在主串查中找出所有与子串T相等的子串,因此可以进行子串定位
(2)找出与子串T相等的所有子串的每一个开始位置,然后再依次用子串V做相应的替换
(3)由于子串T和子串V的长度不同,要改变原串S的长度
(4)如扫描完主串S的全部字符,未能找到与子串相等的子串,则主串S保持原样,不做任何替换
算法描述如下:
1 typedef struct /*定义顺序串结构体*/ 2 { 3 char ch[MaxSize]; 4 int Length; 5 6 }SeqString;/*SeqString是顺序串类型*/ 7 SeqString ss,tt,vv;/*定义全局共变量*/ 8 void StrReplace(SeqString S,SeqString T,SeqString V)/*替代函数*/ 9 { 10 int i,j,k,n,m;/*定义局部变量*/ 11 for(i=0;i<S.Length;i++)/*扫描主串中S中的每个字符*/ 12 for(j=i,k=0;S.ch[j]==T.ch[k];j++,k++) 13 /*子串T中的字符依次与主串S中的字符比较*/ 14 { 15 /*printf("j=%d k=%d\n",j,k);*/ 16 if(k==T.Length-1) 17 /*当K值与子串T长度相等,则找出与子串T相等的字串*/ 18 if(V.Length<=T.Length)/*当子串V的长度小于等于子串T的长度时*/ 19 { 20 /*printf("===>i=%d k=%d\n",i,k);*/ 21 for(n=i,k=0;k<V.Length;n++,k++) 22 S.ch[n]=V.ch[k];/*用子串V代替主串S中与子串T相等的字串*/ 23 S.Length=S.Length-T.Length+V.Length; 24 /*重新计算主串S的长度*/ 25 i=n; 26 /*跳过已经替代的字串,将i值定位到主串中尚未比较过的位置*/ 27 m=T.Length-V.Length;/*计算子串T与子串V的长度差*/ 28 if(m!=0) 29 for(;n<S.Length;n++) 30 S.ch[n]=S.ch[n+m];/*将子串V未能替代且已经比较过的主串S中多余的字符删除*/ 31 break;/*跳出当前for循环,进行新一轮的比较*/ 32 33 } 34 else/*当子串V的长度大于子串T的长度时*/ 35 { 36 m=V.Length-T.Length; 37 S.Length=S.Length+V.Length-T.Length;/*重新计算主串S的长度*/ 38 printf("\nLength222=======%d\n",S.Length); 39 for(n=S.Length;n>i;n--) 40 S.ch[n+m-1]=S.ch[n-1];/*预留出要替代的字串的存放位置*/ 41 for(k=0;k<V.Length;k++,n++) 42 { 43 S.ch[n]=V.ch[k]; 44 printf("k=%d n=%d \n",k,n); 45 }/*用于串V的字串替代主串S中与子串T相等的字串*/ 46 i=n; 47 /*跳过已经替代的字串,将i值定位到主串中尚未比较过的位置*/ 48 outlin(S); 49 break;/*跳出当前for循环,进行新一轮的比较*/ 50 } 51 } 52 outlin(S); 53 }