知识大全 数据结构考研分类复习真题 第四章 答案[15]
Posted 长度
篇首语:一年好景君须记,最是橙黄橘绿时。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 数据结构考研分类复习真题 第四章 答案[15]相关的知识,希望对你有一定的参考价值。
[题目分析]教材中介绍的串置换有两种形式 第一种形式是replace(s i j t) 含义是将s串中从第i个字符开始的j个字符用t串替换 第二种形式是replace(s t v) 含义是将s串中所有非重叠的t串用v代替 我们先讨论第一种形式的替换 因为已经给定顺序存储结构 我们可将s串从第(i+j )到串尾(即s curlen)移动t curlen j绝对值个位置(以便将t串插入) 若j>t curlen 则向左移;若j<t curlen 则向右移动;若j=t curlen 则不必移动 最后将t串复制到s串的合适位置上 当然 应考虑置换后的溢出问题
int replace(strtp s t int i j)//s和t是用一维数组存储的串 本算法将s串从第i个字符开始的连续j个字符用t串置换 操作成功返回 否则返回 表示失败 if(i< || j< || t curlen+s curlen j>maxlen) printf( 参数错误\\n );exit( );//检查参数及置换后的长度的合法性 if(j<t curlen)//若s串被替换的子串长度小于t串长度 则s串部分右移 for(k=s curlen ;k>=i+j ;k ) s ch[k+t curlen j]=s ch[k]; else if (j>t curlen)//s串中被替换子串的长度小于t串的长度 for(k=i +j;k<=s curlen ;k++) s ch[k (j t curlen)]=s ch[k]; for(k= ;k<t curlen;k++) s ch[i +k]=t ch[k]; //将t串复制到s串的适当位置 if(j>t curlen) s curlen=s curlen (j t curlen);else s curlen=s curlen+(t curlen j); //算法结束
[算法讨论]若允许使用另一数组 在检查合法性后 可将s的第i个(不包括i)之前的子串复制到另一子串如s 中 再将t串接到s 串后面 然后将s的第i+j直到尾的部分加到s 之后 最后将s 串复制到s 主要语句有
for(k= ;k<i;k++) s ch[k]=s ch[k]; //将s 第i个字符前的子串复制到s 这时k=i for(k= ;k<t curlen;k++) s ch[i+k]=t ch[k]//将t串接到s 的尾部 l=s curlen+t curlen j ; for(k=s curlen ;k>i +j;k );//将子串第i+j 个字符以后的子串复制到s s ch[l ]=s ch[k] for(k= ;k<s curlen+t curlen j;k++) s ch[k]=s ch[k];//将结果串放入s
下面讨论replace(s t v)的算法 该操作的意义是用串v替换所有在串s中出现的和非空串t相等的不重叠的子串 本算法不指定存储结构 只使用串的基本运算
void replace(string s t v)//本算法是串的置换操作 将串s中所有非空串t相等且不重复的子串用v代替 i=index(s t);//判断s是否有和t相等的子串 if(i!= )//串s中包含和t相等的子串 creat(temp );//creat操作是将串常量(此处为空串)赋值给temp m=length(t);n=length(s);//求串t和s的长度 while(i!= ) assign(temp concat(temp substr(s i ) v));//用串v替换t形成部分结果 assign(s substr(s i+m n i m+ ));//将串s中串后的部分形成新的s串 n=n (i ) m;//求串s的长度 i=index(s t);//在新s串中再找串t的位置 assign(s contact(temp s)); //将串temp和剩余的串s连接后再赋值给s //if结束 //算法结束
cha138/Article/program/sjjg/201311/22614相关参考