问答题 阅读以下说明和C函数,将解答填入答题纸的对应栏内。 [说明] 函数del_substr(S,T)的功能是从头至尾扫描字符串S,删除其中与字符串T相同的所有子串,其处理过程为:首先从串S的第一个字符开始查找子串T,若找到,则将后面的字符向前移动将子串T覆盖掉,然后继续查找子串T,否则从串S的第二个字符开始查找,依此类推,重复该过程,直到串S的结尾为止。该函数中字符串的存储类型SString定义如下: typedef struct { char* ch; /*串空间的首地址*/ int length; /*串长*/ }SString; [C函数] void del_substr(SString* S, SString T) { iht i, j; if(S->length<1 ||T.length<1 ||S->length<T.length) return; i=0; /* i为串S中字符的下标*/ for (;;) { j =0; /*j为串T中字符的下标*/ while(i<S->length&& j <T.length){ /* 在串S中查找与T才目同的子串*/ if(S->ch[i] ==T.ch[j]) { i++; j++; } else { i={{U}} (1) {{/U}};j=0; /*i值回退,为继续查找T做准备*/ } } if({{U}} (2) {{/U}}){ /*在s中找到与T相同的子串*/ i={{U}} (3) {{/U}}; /*计算s中子串T的起始下标*/ for(k=i+T.length;k<S->length;k++)/* 通过覆盖子串T进行删除*/ S->ch[{{U}} (4) {{/U}}] =S->ch[k]; S->length={{U}} (5) {{/U}}; /* 更新S的长度*/ } else break; /* 串S中不存在于串T*/ } }
【正确答案】
【答案解析】(1) i-j+1 (2) j==T.length (3)i-T.length (4) i++ (5) S->length-T.length [解析] 空(1)处主要实现的功能是当串S和串T中有字母不相同时,串S下标需要返回至上一次串S和串T字符不同的位置,为继续查找串T做准备,串S的下标i返回的位置是串T的下标走过的长度,所以空(1)处应填“i-j+1”。因为j表示串S与串T比较中串T的下标,如果j的值等于串T的长度,则表示串S中有与串T相同的子串,所以空 (2)处应该填写j==T.length。因为串S和串T在比较时,若字符一样,i和j同时加1,所以,串S在子串T的起始下标,应该为S的当前下标i减去串T的长度,即i-T.length,所以空(3)处应填“i-T.length”。删除与串T相同的子串的方法是将后面的元素向前移动进行覆盖,应该从串S在子串T的起始下标i开始,将后面的元素依次向前移动,最终覆盖子串,所以空(4)处填i++。每当删除一个与串T相同的子串,串S的长度就减少T.length,所以空(5)处填S->length-T.length。