问答题 采用顺序存储方式存储串,编写一个函数将串s1中的第i个字符到第j个字符之间的字符(不包括第i个和第j个字符)用s2串替换,函数名为substitute(s1,i,j,s2)。例如:substitute('abcd',1,3,'xyz')返回'axyzcd'。
【正确答案】(1)数据结构
   采用字符串的顺序表示定义。
   (2)思路
   设置两个下标变量si,di。si指向源,di指向目标。先比较s1中i和j之间的字符个数和s2中字符个数的多少。若前者多,则先将s1中j以后的字符向前搬;若后者多,则向后搬。注意这两个搬的算法是不同的。然后再将s2插入s1经过搬后留出的空间中。
   (3)算法
   PSeqString substitute(PSeqString s1,int i,int j,PSeqString s2){
   /*返回指向替换后的字符串的指针,s1和s2被插入和要插入的字符串,i和j如题*/
   int si,di;
   if(j-i-1<s2->n){
       for(si=s1->n-1,di=s1->n+s2->n+i-j;si>=j-1;si--,di--){
           s1->c[di]=s1->c[si];
       }
       }
       else if(j-i-1>s2->n){
           for(si=j-1,di=s2->n+i;si<s1->n;si++,di++){
               s1->c[di]=s1->c[si];
           }
       }
       for(si=0,di=i;si<s2->n;si++,di++){
           s1->c[di]=s2->c[si];
       }
       s1->n=s1->n+s2->n+i-j+1;
       return s1;
   }
   (4)代价分析
   最坏时间代价O(n)(其中n=length(s1)+length(s2))。
【答案解析】