关于anyviewsDS的两道题4.17&4.30

  关于anyviewsDS的两道题4.17&4.30上个星期压根没做过AnyviewsDS的题目,忙着又看了一遍C++,复习了一下现在正在做着成绩管理系统。本来想写那个3.20涂色块的,因为上星期刚学会(看了毛的代码),但被捷足先登就作罢。还是在AnyviewsDS里面挑了两道比较繁琐的题目,用的算法都很朴实,像4.17那道题可以用KMP算法来做的,不过我做的时候还没讲到,以后有时间在改吧。以下是代码,欢迎扔鸡蛋。

 

 

4.30⑤ 假设以定长顺序存储结构表示串,试设计
一个算法,求串s中出现的{dy}个最长重复子串及
其位置,并分析你的算法的时间复杂度。

 

代码
void CommonStr(SString s, SString &sub, int &loc)
/* 求串s中出现的{dy}个最长重复子串sub及其位置loc */
{
//pos,s_pos,sub_pos分别为{dy}个重复子串位置,在串S查询重复
int pos,s_pos=1,sub_pos; //串的位置,第二个重复子串位置
int length=0,max_len=0,max_loc=0; //length为当前匹配字符长度
sub_pos=s_pos+1; //
pos=sub_pos;
loc
=1; //遍历时当前字符
while(s_pos<=s[0]) //前一个字符未到字符串末
{
while(pos<=s[0]) //后一个字符味道字符串末
{
if(s[s_pos]==s[pos]) //前,后两字符相等
{
++s_pos;
++pos;
++length;
if(pos>s[0]) //第二个字符到达字符串末,保存{zd0}长度和位置
{
if(max_len<length)
{
max_len
=length;
max_loc
=loc;
}
}
}
else //否则前字符回到原位置,后一个字符向后移动一位
{
++sub_pos;
pos
=sub_pos;
s_pos
=loc;
if(max_len<length) //保存数据(如果长度更大的话)
{
max_len
=length;
max_loc
=loc;
}
length
=0;
}
}
//while
++loc; //前一个字符向后移动一位
s_pos=loc; //继续遍历字符串
sub_pos=loc+1;
pos
=sub_pos;
length
=0;
if(s_pos==s[0]) //遍历完字符串
break;
}
loc
=max_loc; //{zd0}长度
for(pos=1;pos<=max_len;++pos,++max_loc)
sub[pos]
=s[max_loc]; //最长字符串
sub[0]=max_len;
}

 4.17③  编写算法,实现串的基本操作Replace(&S,T,V)。
要求采用教科书4.2.1节中所定义的定长顺序存储表示,
但不允许调用串的基本操作。

代码
Status Replace(SString& s, SString t, SString v)
/* 用串v替换串s中所有和串t匹配的子串。 */
/* 若有与t匹配的子串被替换,则返回TRUE;*/
/* 否则返回FALSE */
{
//pos,s_pos,t_pos,v_pos,ss_pos分别为s当前位置,匹配时s位置,串t当前位置
int pos=1,s_pos,t_pos,v_pos,ss_pos=1; //串V当前位置,串ss_str当前位置
SString ss_str; //保存replace后的数据
bool flag=0; //判断是否含有匹配
while(pos<=s[0]-t[0]+1)
{
s_pos
=pos;
for(t_pos=1;t_pos<=t[0];++t_pos)
if(s[s_pos]==t[t_pos])
++s_pos;
else
{s_pos
=pos;break;}
if(t_pos>t[0]) //有与串T匹配
{
for(v_pos=1;v_pos<=v[0];++v_pos,++ss_pos)
ss_str[ss_pos]
=v[v_pos];
pos
+=t[0];
flag
=1;
}
else
{
ss_str[ss_pos]
=s[pos];
++ss_pos;
++pos;
}
}
if(!flag)
return FALSE;
while(pos<=s[0]) //将剩余字符放到ss_str
{
ss_str[ss_pos]
=s[pos];
++pos;
++ss_pos;
}
ss_str[
0]=ss_pos-1;
s[
0]=ss_str[0];
for(ss_pos=1;ss_pos<=ss_str[0];++ss_pos) //将ss_str复制到串s
s[ss_pos]=ss_str[ss_pos];
return TRUE;
}

                                                                                                                      by  720

posted on 2010-04-13 00:58 阅读(32)  

郑重声明:资讯 【关于anyviewsDS的两道题4.17&4.30】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——