第四章 串答案
数据结构第四章考试题库(含答案)
第四章串一、选择题1.下面关于串的的叙述中,哪一个是不正确的()【北方交通大学 2001 一、5(2分)】A.串是字符的有限序列 B.空串是由空格构成的串C.模式匹配是串的一种重要运算 D.串既可以采用顺序存储,也可以采用链式存储2 若串S1=‘ABCDEFG’, S2=‘9898’ ,S3=‘###’,S4=‘012345’,执行concat(replace(S1,substr(S1,length(S2),length(S3)),S3),substr(S4,index (S2,‘8’),length(S2)))其结果为()【北方交通大学 1999 一、5 (25/7分)】A.ABC###G0123 B.ABCD###2345 C.ABC###G2345 D.ABC###2345E.ABC###G1234 F.ABCD###1234 G.ABC###012343.设有两个串p和q,其中q是p的子串,求q在p中首次出现的位置的算法称为()A.求子串 B.联接 C.匹配 D.求串长【北京邮电大学 2000 二、4(20/8分)】【西安电子科技大学 1996 一、1 (2分)】4.已知串S=‘aaab’,其Next数组值为()。
【西安电子科技大学 1996 一、7 (2分)】A.0123 B.1123 C.1231 D.12115.串‘ababaaababaa’的next数组为()。
【中山大学 1999 一、7】A.0 B.012121111212 C.0 D.06.字符串‘ababaabab’的nextval 为()A.(0,1,0,1,04,1,0,1) B.(0,1,0,1,0,2,1,0,1)C.(0,1,0,1,0,0,0,1,1) D.(0,1,0,1,0,1,0,1,1 )【北京邮电大学 1999 一、1(2分)】7.模式串t=‘abcaabbcabcaabdab’,该模式串的next数组的值为(),nextval 数组的值为()。
严蔚敏《数据结构(c语言版)习题集》答案第四章 串
林银花
一、教材说明:
1、 课题:《一定能摸到红球吗?》
2、 本节内容的地位和作用
在现代社会中,人们面临着更多的机会和选择,常常需要在不确定情境中作出合理的决策,概率正是通过对不确定现象和事件发生的可能性的刻画,来为人们更好的制定决策提供依据和建议.本节内容又是义务教育阶段,唯一培养学生从不确定的角度来观察世界的数学内容,让学生了解可能性是普遍的,有助于他们理解社会,适应生活.
(1) 每位同学从盒子中轮流摸球,记录下所摸球的颜色,并将球放回盒中.
(2) 做10次这样的活动,将最终结果填在表中.
(3) 全班将各小组活动进行汇总,摸到红球的次数是多少?摸到黄球的次数是多少?他们各占总数的百分比是多少?
(4) 你认为哪种颜色的球多?打开看一看.
(5) 如果从盒中任意摸出一球,你认为摸到哪种颜色的球可能性大? 学生阅读学习目标.
学生两人一组进行活动.一人摸一人记录.并交流.
题(1):学生先想象后画图,并通过搭建几何体验证学习成果。
题(2):学生四人一组进行活动,一人搭几何体,另三人画图并交流,如有异义,举手询问。依次轮流。 使学生明确学习目标,进入学习角色,做到有的放矢。
目的是使学生体会到进行概率试验时,一定要保证随机性.
课堂组织策略:创设贴近学生生活,生动有趣的问题情境,开展活泼、主动、有效的数学活动,组织学生主动参与、勤于动手、积极思考,使他们在自主探索和合作交流的过程中真正理解和掌握概率有关内容。
学生学习策略:明确学习目标,了解所需掌握的知识,在教师的组织、引导、点拨下主动地从事观察、试验、猜测、验证与交流等数学活动,从而真正有效地理解和掌握知识。
(3)、情感目标:
第4章 串(习题)
第四章串一、选择题1.下面关于串的的叙述中,哪一个是不正确的?()(2 分)A.串是字符的有限序列 B.空串是由空格构成的串C.模式匹配是串的一种重要运算 D.串既可以采用顺序存储,也可以采用链式存储2 若串S1=‘ABCDEFG’, S2=‘9898’ ,S3=‘###’,S4=‘’,执行concat(replace(S1,substr(S1,length(S2),length(S3)),S3),substr(S4,index(S2,‘8’),length(S2))) 其结果为()(7 分)A.ABC###G0123 B.ABCD###2345 C.ABC###G2345 D.ABC###2345E.ABC###G1234 F.ABCD###1234 G.ABC###012343.设有两个串p 和q,其中q 是p 的子串,求q 在p 中首次出现的位置的算法称为()A.求子串 B.联接 C.匹配 D.求串长(2 分)4.已知串S=‘aaab’,其Next 数组值为()。
(2 分)A.0123 B.1123 C.1231 D.12115.串‘ababaaababaa’的next 数组为()。
A.9 B.2 C.6 D.456.字符串‘ababaabab’的nextval 为()A.(0,1,0,1,04,1,0,1) B.(0,1,0,1,0,2,1,0,1)C.(0,1,0,1,0,0,0,1,1) D.(0,1,0,1,0,1,0,1,1 )(2 分)7.模式串t=‘abcaabbcabcaabdab’,该模式串的next 数组的值为(),nextval 数组的值为()。
A.0 1 1 1 2 2 1 1 1 2 3 4 5 6 7 1 2 B.0 1 1 1 2 1 2 1 1 2 3 4 5 6 1 1 2C.0 1 1 1 0 0 1 3 1 0 1 1 0 0 7 0 1 D.0 1 1 1 2 2 3 1 1 2 3 4 5 6 7 1 2E.0 1 1 0 0 1 1 1 0 1 1 0 0 1 7 0 1 F.0 1 1 0 2 1 3 1 0 1 1 0 2 1 7 0 1(2 分)8.若串S=’software’,其子串的数目是()。
数据结构教程李春葆课后答案第4章串
8. 采用顺序结构存储串,设计一个实现串通配符匹配的算法 pattern_index(),其中的 通配符只有‘?’ ,它可以和任一个字符匹配成功。例如,pattern_index("?re","there are") 返回的结果是 2。 解:采用 BF 算法的穷举法的思路,只需要增加对‘?’字符的处理功能。对应的算法 如下:
void maxsubstr(SqString s,SqString &t) { int maxi=0,maxlen=0,len,i,j,k; i=0; while (i<s.length) //从下标为 i 的字符开始 { j=i+1; //从 i 的下一个位置开始找重复子串 while (j<s.length) { if (s.data[i]==s.data[j]) //找一个子串,其起始下标为 i,长度为 len { len=1; for(k=1;s.data[i+k]==s.data[j+k];k++) len++; if (len>maxlen) //将较大长度者赋给 maxi 与 maxlen { maxi=i; maxlen=len; } j+=len; } else j++; } i++; //继续扫描第 i 字符之后的字符 } t.length=maxlen; //将最长重复子串赋给 t for (i=0;i<maxlen;i++) t.data[i]=s.data[maxi+i]; }
SqString CommChar(SqString s1,SqString s2) { SqString s3; int i,j,k=0; for (i=0;i<s1.length;i++) { for (j=0;j<s2.length;j++) if (s2.data[j]==s1.data[i]) break; if (j<s2.length) //s1.data[i]是公共字符 { s3.data[k]=s1.data[i]; k++; } } s3.length=k; return s3; }
数据结构第四章串习题及答案
习题四串一、单项选择题1.下面关于串的的叙述中,哪一个是不正确的?()A.串是字符的有限序列 B.空串是由空格构成的串C.模式匹配是串的一种重要运算 D.串既可以采用顺序存储,也可以采用链式存储2.串是一种特殊的线性表,其特殊性体现在()。
A.可以顺序存储 B.数据元素是一个字符C.可以链接存储 D.数据元素可以是多个字符3.串的长度是指()A.串中所含不同字母的个数 B.串中所含字符的个数C.串中所含不同字符的个数 D.串中所含非空格字符的个数4.设有两个串p和q,其中q是p的子串,求q在p中首次出现的位置的算法称为()A.求子串 B.联接 C.匹配 D.求串长5.若串S=“softwa re”,其子串的个数是()。
A.8 B.37 C.36 D.9二、填空题1.含零个字符的串称为______串。
任何串中所含______的个数称为该串的长度。
2.空格串是指__ __,其长度等于__ __。
3.当且仅当两个串的______相等并且各个对应位置上的字符都______时,这两个串相等。
一个串中任意个连续字符组成的序列称为该串的______串,该串称为它所有子串的______串。
4.INDEX(‘DATAST RUCTU RE’,‘STR’)=________。
5.模式串P=‘abaabc ac’的next函数值序列为________。
6.下列程序判断字符串s是否对称,对称则返回1,否则返回0;如 f("abba")返回1,f("abab")返回0;int f((1)__ ______){int i=0,j=0;while(s[j])(2)___ _____;for(j--; i<j && s[i]==s[j]; i++,j--);return((3)___ ____)}7.下列算法实现求采用顺序结构存储的串s和串t的一个最长公共子串。
第四章 串答案
第四章答案4.1 简述下列每对术语的区别:空串和空白串;串常量和串变量;主串和子串;静态分配的顺序串和动态分配的顺序串;目标串和模式串;有效位移和无效位移。
答:●空串是指不包含任何字符的串,它的长度为零。
空白串是指包含一个或多个空格的串,空格也是字符。
●串常量是指在程序中只可引用但不可改变其值的串。
串变量是可以在运行中改变其值的。
●主串和子串是相对的,一个串中任意个连续字符组成的串就是这个串的子串,而包含子串的串就称为主串。
●静态分配的顺序串是指串的存储空间是确定的,即串值空间的大小是静态的,在编译时刻就被确定。
动态分配的顺序串是在编译时不分配串值空间,在运行过程中用malloc和free等函数根据需要动态地分配和释放字符数组的空间(这个空间长度由分配时确定,也是顺序存储空间)。
●目标串和模式串:在串匹配运算过程中,将主串称为目标串,而将需要匹配的子串称为模式串,两者是相对的。
●有效位移和无效位移:在串定位运算中,模式串从目标的首位开始向右位移,每一次合法位移后如果模式串与目标中相应的字符相同,则这次位移就是有效位移(也就是从此位置开始的匹配成功),反之,若有不相同的字符存在,则此次位移就是无效位移(也就是从此位置开始的匹配失败)。
4.2 假设有如下的串说明:char s1[30]="Stocktom,CA", s2[30]="March 5 1999", s3[30], *p;(1)在执行如下的每个语句后p的值是什么?p=stchr(s1,'t'); p=strchr(s2,'9'); p=strchr(s2,'6');(2)在执行下列语句后,s3的值是什么?strcpy(s3,s1); strcat(s3,","); strcat(s3,s2);(3)调用函数strcmp(s1,s2)的返回值是什么?(4)调用函数strcmp(&s1[5],"ton")的返回值是什么?(5)调用函数stlen(strcat(s1,s2))的返回值是什么?解:(1) stchr(*s,c)函数的功能是查找字符c在串s中的位置,若找到,则返回该位置,否则返回NULL。
数据结构习题集答案(C语言版严蔚敏)第四章串
第四章串4.10void String_Reverse(Stringtype s,Stringtype &r)//求s的逆串r{StrAssign(r,''); //初始化r为空串for(i=Strlen(s);i;i--){StrAssign(c,SubString(s,i,1));StrAssign(r,Concat(r,c)); //把s的字符从后往前添加到r中}}//String_Reverse4.11void String_Subtract(Stringtype s,Stringtype t,Stringtype &r)//求所有包含在串s中而t中没有的字符构成的新串r{StrAssign(r,'');for(i=1;i<=Strlen(s);i++){StrAssign(c,SubString(s,i,1));for(j=1;j<i&&StrCompare(c,SubString(s,j,1));j++); //判断s的当前字符c是否第一次出现if(i==j){for(k=1;k<=Strlen(t)&&StrCompare(c,SubString(t,k,1));k++); //判断当前字符是否包含在t中if(k>Strlen(t)) StrAssign(r,Concat(r,c));}}//for}//String_Subtract4.12int Replace(Stringtype &S,Stringtype T,Stringtype V);//将串S中所有子串T替换为V,并返回置换次数{for(n=0,i=1;i<=Strlen(S)-Strlen(T)+1;i++) //注意i的取值范围if(!StrCompare(SubString(S,i,Strlen(T)),T)) //找到了与T匹配的子串{ //分别把T的前面和后面部分保存为head和tailStrAssign(head,SubString(S,1,i-1));StrAssign(tail,SubString(S,i+Strlen(T),Strlen(S)-i-Strlen(T)+1));StrAssign(S,Concat(head,V));StrAssign(S,Concat(S,tail)); //把head,V,tail连接为新串i+=Strlen(V); //当前指针跳到插入串以后n++;}//ifreturn n;}//Replace分析:i+=Strlen(V);这一句是必需的,也是容易忽略的.如省掉这一句,则在某些情况下,会引起不希望的后果,虽然在大多数情况下没有影响.请思考:设S='place', T='ace', V='face',则省掉i+=Strlen(V);运行时会出现什么结果?4.13int Delete_SubString(Stringtype &s,Stringtype t)//从串s中删除所有与t相同的子串,并返回删除次数{for(n=0,i=1;i<=Strlen(s)-Strlen(t)+1;i++)if(!StrCompare(SubString(s,i,Strlen(t)),t)){StrAssign(head,SubString(S,1,i-1));StrAssign(tail,SubString(S,i+Strlen(t),Strlen(s)-i-Strlen(t)+1));StrAssign(S,Concat(head,tail)); //把head,tail连接为新串n++;}//ifreturn n,}//Delete_SubString4.14Status NiBoLan_to_BoLan(Stringtype str,Stringtype &new)//把前缀表达式str转换为后缀式new{Initstack(s); //s的元素为Stringtype类型for(i=1;i<=Strlen(str);i++){r=SubString(str,i,1);if(r为字母) push(s,r);else{if(StackEmpty(s)) return ERROR;pop(s,a);if(StackEmpty(s)) return ERROR;pop(s,b);StrAssign(t,Concat(r,b));StrAssign(c,Concat(t,a)); //把算符r,子前缀表达式a,b连接为新子前缀表达式cpush(s,c);}}//forpop(s,new);if(!StackEmpty(s)) return ERROR;return OK;}//NiBoLan_to_BoLan分析:基本思想见书后注释3.23.请读者用此程序取代作者早些时候对3.23题给出的程序.4.15void StrAssign(Stringtype &T,char chars&#;)//用字符数组chars给串T赋值,Stringtype的定义见课本{for(i=0,T[0]=0;chars[i];T[0]++,i++) T[i+1]=chars[i];}//StrAssign4.16char StrCompare(Stringtype s,Stringtype t)//串的比较,s>t时返回正数,s=t时返回0,s<t时返回负数{for(i=1;i<=s[0]&&i<=t[0]&&s[i]==t[i];i++);if(i>s[0]&&i>t[0]) return 0;else if(i>s[0]) return -t[i];else if(i>t[0]) return s[i];else return s[i]-t[i];}//StrCompare4.17int String_Replace(Stringtype &S,Stringtype T,Stringtype V);//将串S中所有子串T替换为V,并返回置换次数{for(n=0,i=1;i<=S[0]-T[0]+1;i++){for(j=i,k=1;T[k]&&S[j]==T[k];j++,k++);if(k>T[0]) //找到了与T匹配的子串:分三种情况处理{if(T[0]==V[0])for(l=1;l<=T[0];l++) //新子串长度与原子串相同时:直接替换S[i+l-1]=V[l];else if(T[0]<V[0]) //新子串长度大于原子串时:先将后部右移{for(l=S[0];l>=i+T[0];l--)S[l+V[0]-T[0]]=S[l];for(l=1;l<=V[0];l++)S[i+l-1]=V[l];}else //新子串长度小于原子串时:先将后部左移{for(l=i+V[0];l<=S[0]+V[0]-T[0];l++)S[l]=S[l-V[0]+T[0]];for(l=1;l<=V[0];l++)S[i+l-1]=V[l];}S[0]=S[0]-T[0]+V[0];i+=V[0];n++;}//if}//forreturn n;}//String_Replace4.18typedef struct {char ch;int num;} mytype;void StrAnalyze(Stringtype S)//统计串S中字符的种类和个数{mytype T[MAXSIZE]; //用结构数组T存储统计结果for(i=1;i<=S[0];i++){c=S[i];j=0;while(T[j].ch&&T[j].ch!=c) j++; //查找当前字符c是否已记录过if(T[j].ch) T[j].num++;else T[j]={c,1};}//forfor(j=0;T[j].ch;j++)printf("%c: %d\n",T[j].ch,T[j].num);}//StrAnalyze4.19void Subtract_String(Stringtype s,Stringtype t,Stringtype &r)//求所有包含在串s中而t中没有的字符构成的新串r{r[0]=0;for(i=1;i<=s[0];i++){c=s[i];for(j=1;j<i&&s[j]!=c;j++); //判断s的当前字符c是否第一次出现if(i==j){for(k=1;k<=t[0]&&t[k]!=c;k++); //判断当前字符是否包含在t中if(k>t[0]) r[++r[0]]=c;}}//for}//Subtract_String4.20int SubString_Delete(Stringtype &s,Stringtype t)//从串s中删除所有与t相同的子串,并返回删除次数{for(n=0,i=1;i<=s[0]-t[0]+1;i++){for(j=1;j<=t[0]&&s[i+j-1]==t[i];j++);if(j>m) //找到了与t匹配的子串{for(k=i;k<=s[0]-t[0];k++) s[k]=s[k+t[0]]; //左移删除s[0]-=t[0];n++;}}//forreturn n;}//Delete_SubString4.21typedef struct{char ch;LStrNode *next;} LStrNode,*LString; //链串结构void StringAssign(LString &s,LString t)//把串t赋值给串s{s=malloc(sizeof(LStrNode));for(q=s,p=t->next;p;p=p->next){r=(LStrNode*)malloc(sizeof(LStrNode));r->ch=p->ch;q->next=r;q=r;}q->next=NULL;}//StringAssignvoid StringCopy(LString &s,LString t)//把串t复制为串s.与前一个程序的区别在于,串s业已存在.{for(p=s->next,q=t->next;p&&q;p=p->next,q=q->next){p->ch=q->ch;pre=p;}while(q){p=(LStrNode*)malloc(sizeof(LStrNode));p->ch=q->ch;pre->next=p;pre=p;}p->next=NULL;}//StringCopychar StringCompare(LString s,LString t)//串的比较,s>t时返回正数,s=t时返回0,s<t时返回负数{for(p=s->next,q=t->next;p&&q&&p->ch==q->ch;p=p->next,q=q->next);if(!p&&!q) return 0;else if(!p) return -(q->ch);else if(!q) return p->ch;else return p->ch-q->ch;}//StringCompareint StringLen(LString s)//求串s的长度(元素个数){for(i=0,p=s->next;p;p=p->next,i++);return i;}//StringLenLString * Concat(LString s,LString t)//连接串s和串t形成新串,并返回指针{p=malloc(sizeof(LStrNode));for(q=p,r=s->next;r;r=r->next){q->next=(LStrNode*)malloc(sizeof(LStrNode));q=q->next;q->ch=r->ch;}//for //复制串sfor(r=t->next;r;r=r->next){q->next=(LStrNode*)malloc(sizeof(LStrNode));q=q->next;q->ch=r->ch;}//for //复制串tq->next=NULL;return p;}//ConcatLString * Sub_String(LString s,int start,int len)//返回一个串,其值等于串s从start位置起长为len的子串{p=malloc(sizeof(LStrNode));q=p;for(r=s;start;start--,r=r->next); //找到start所对应的结点指针rfor(i=1;i<=len;i++,r=r->next){q->next=(LStrNode*)malloc(sizeof(LStrNode));q=q->next;q->ch=r->ch;} //复制串tq->next=NULL;return p;}//Sub_String4.22void LString_Concat(LString &t,LString &s,char c)//用块链存储结构,把串s插入到串t的字符c 之后{p=t.head;while(p&&!(i=Find_Char(p,c))) p=p->next; //查找字符cif(!p) //没找到{t.tail->next=s.head;t.tail=s.tail; //把s连接在t的后面}else{q=p->next;r=(Chunk*)malloc(sizeof(Chunk)); //将包含字符c的节点p分裂为两个for(j=0;j<i;j++) r->ch[j]='#'; //原结点p包含c及其以前的部分for(j=i;j<CHUNKSIZE;j++) //新结点r包含c以后的部分{r->ch[j]=p->ch[j];p->ch[j]='#'; //p的后半部分和r的前半部分的字符改为无效字符'#'}p->next=s.head;s.tail->next=r;r->next=q; //把串s插入到结点p和r之间}//elset.curlen+=s.curlen; //修改串长s.curlen=0;}//LString_Concatint Find_Char(Chunk *p,char c)//在某个块中查找字符c,如找到则返回位置是第几个字符,如没找到则返回0{for(i=0;i<CHUNKSIZE&&p->ch[i]!=c;i++);if(i==CHUNKSIZE) return 0;else return i+1;}//Find_Char4.23int LString_Palindrome(LString L)//判断以块链结构存储的串L是否为回文序列,是则返回1,否则返回0{InitStack(S);p=S.head;i=0;k=1; //i指示元素在块中的下标,k指示元素在整个序列中的序号(从1开始) for(k=1;k<=S.curlen;k++){if(k<=S.curlen/2) Push(S,p->ch[i]); //将前半段的字符入串else if(k>(S.curlen+1)/2){Pop(S,c); //将后半段的字符与栈中的元素相匹配if(p->ch[i]!=c) return 0; //失配}if(++i==CHUNKSIZE) //转到下一个元素,当为块中最后一个元素时,转到下一块{p=p->next;i=0;}}//forreturn 1; //成功匹配}//LString_Palindrome4.24void HString_Concat(HString s1,HString s2,HString &t)//将堆结构表示的串s1和s2连接为新串t{if(t.ch) free(t.ch);t.ch=malloc((s1.length+s2.length)*sizeof(char));for(i=1;i<=s1.length;i++) t.ch[i-1]=s1.ch[i-1];for(j=1;j<=s2.length;j++,i++) t.ch[i-1]=s2.ch[j-1];t.length=s1.length+s2.length;}//HString_Concat4.25int HString_Replace(HString &S,HString T,HString V)//堆结构串上的置换操作,返回置换次数{for(n=0,i=0;i<=S.length-T.length;i++){for(j=i,k=0;k<T.length&&S.ch[j]==T.ch[k];j++,k++);if(k==T.length) //找到了与T匹配的子串:分三种情况处理{if(T.length==V.length)for(l=1;l<=T.length;l++) //新子串长度与原子串相同时:直接替换S.ch[i+l-1]=V.ch[l-1];else if(T.length<V.length) //新子串长度大于原子串时:先将后部右移{for(l=S.length-1;l>=i+T.length;l--)S.ch[l+V.length-T.length]=S.ch[l];for(l=0;l<V.length;l++)S[i+l]=V[l];}else //新子串长度小于原子串时:先将后部左移{for(l=i+V.length;l<S.length+V.length-T.length;l++)S.ch[l]=S.ch[l-V.length+T.length];for(l=0;l<V.length;l++)S[i+l]=V[l];}S.length+=V.length-T.length;i+=V.length;n++;}//if}//forreturn n;}//HString_Replace4.26Status HString_Insert(HString &S,int pos,HString T)//把T插入堆结构表示的串S的第pos个字符之前{if(pos<1) return ERROR;if(pos>S.length) pos=S.length+1;//当插入位置大于串长时,看作添加在串尾S.ch=realloc(S.ch,(S.length+T.length)*sizeof(char));for(i=S.length-1;i>=pos-1;i--)S.ch[i+T.length]=S.ch[i]; //后移为插入字符串让出位置for(i=0;i<T.length;i++)S.ch[pos+i-1]=T.ch[pos]; //插入串TS.length+=T.length;return OK;}//HString_Insert4.27int Index_New(Stringtype s,Stringtype t)//改进的定位算法{i=1;j=1;while(i<=s[0]&&j<=t[0]){if((j!=1&&s[i]==t[j])||(j==1&&s[i]==t[j]&&s[i+t[0]-1]==t[t[0]])){ //当j==1即匹配模式串的第一个字符时,需同时匹配其最后一个i=i+j-2;j=1;}else{i++;j++;}}//whileif(j>t[0]) return i-t[0];}//Index_New4.28void LGet_next(LString &T)//链串上的get_next算法{p=T->succ;p->next=T;q=T;while(p->succ){if(q==T||p->data==q->data){p=p->succ;q=q->succ;p->next=q;}else q=q->next;}//while}//LGet_nextLStrNode * LIndex_KMP(LString S,LString T,LStrNode *pos)//链串上的KMP匹配算法,返回值为匹配的子串首指针{p=pos;q=T->succ;while(p&&q){if(q==T||p->chdata==q->chdata){p=p->succ;q=q->succ;}else q=q->next;}//whileif(!q){for(i=1;i<=Strlen(T);i++)p=p->next;return p;} //发现匹配后,要往回找子串的头return NULL;}//LIndex_KMP4.30void Get_LRepSub(Stringtype S)//求S的最长重复子串的位置和长度{for(maxlen=0,i=1;i<S[0];i++)//串S2向右移i格{for(k=0,j=1;j<=S[0]-i;j++)//j为串S2的当前指针,此时串S1的当前指针为i+j,两指针同步移动{if(S[j]==S[j+i]) k++; //用k记录连续相同的字符数else k=0; //失配时k归零if(k>maxlen) //发现了比以前发现的更长的重复子串{lrs1=j-k+1;lrs2=mrs1+i;maxlen=k; //作记录}}//forif(maxlen){printf("Longest Repeating Substring length:%d\n",maxlen);printf("Position1:%d Position 2:%d\n",lrs1,lrs2);}else printf("No Repeating Substring found!\n");}//Get_LRepSub分析:i代表"错位值".本算法的思想是,依次把串S的一个副本S2向右错位平移1格,2格,3格,...与自身S1相匹配,如果存在最长重复子串,则必然能在此过程中被发现.用变量lrs1,lrs2,maxlen 来记录已发现的最长重复子串第一次出现位置,第二次出现位置和长度.题目中未说明"重复子串"是否允许有重叠部分,本算法假定允许.如不允许,只需在第二个for语句的循环条件中加上k<=i即可.本算法时间复杂度为O(Strlen(S)^2).4.31void Get_LPubSub(Stringtype S,Stringtype T)//求串S和串T的最长公共子串位置和长度{if(S[0]>=T[0]){StrAssign(A,S);StrAssign(B,T);}else{StrAssign(A,T);StrAssign(B,S);} //为简化设计,令S和T中较长的那个为A,较短的那个为Bfor(maxlen=0,i=1-B[0];i<A[0];i++){if(i<0) //i为B相对于A的错位值,向左为负,左端对齐为0,向右为正{jmin=1;jmax=i+B[0];}//B有一部分在A左端的左边else if(i>A[0]-B[0]){jmin=i;jmax=A[0];}//B有一部分在A右端的右边else{jmin=i;jmax=i+B[0];}//B在A左右两端之间.//以上是根据A和B不同的相对位置确定A上需要匹配的区间(与B重合的区间)的端点:jmin,jmax.for(k=0,j=jmin;j<=jmax;j++){if(A[j]==B[j-i]) k++;else k=0;if(k>maxlen){lps1=j-k+1;lps2=j-i-k+1;maxlen=k;}}//for}//forif(maxlen){if(S[0]>=T[0]){lpsS=lps1;lpsT=lps2;}else{lpsS=lps2;lpsT=lps1;} //将A,B上的位置映射回S,T上的位置printf("Longest Public Substring length:%d\n",maxlen);printf("Position in S:%d Position in T:%d\n",lpsS,lpsT);}//ifelse printf("No Repeating Substring found!\n");}//Get_LPubSub分析:本题基本思路与上题同.唯一的区别是,由于A,B互不相同,因此B不仅要向右错位,而且还要向左错位,以保证不漏掉一些情况.当B相对于A的位置不同时,需要匹配的区间的计算公式也各不相同,请读者自己画图以帮助理解.本算法的时间复杂度是o(strlrn(s)*strlen(t))。
串-第4章-《数据结构题集》答案解析-严蔚敏吴伟民版
串-第4章-《数据结构题集》答案解析-严蔚敏吴伟民版习题集解析部分第4章串——《数据结构题集》-严蔚敏.吴伟民版源码使⽤说明链接☛☛☛课本源码合辑链接☛☛☛习题集全解析链接☛☛☛相关测试数据下载链接☛本习题⽂档的存放⽬录:数据结构\▼配套习题解析\▼04 串⽂档中源码的存放⽬录:数据结构\▼配套习题解析\▼04 串\▼习题测试⽂档-04源码测试数据存放⽬录:数据结构\▼配套习题解析\▼04 串\▼习题测试⽂档-04\Data⼀、基础知识题4.1❶简述空串和空格串(或称空格符串)的区别。
4.2❷对于教科书4.1节中所述串的各个基本操作,讨论是否可由其他基本操作构造⽽得,如何构造?4.3❶设s = ‘I AM A STUDENT’,t = ‘GOOD’,q = ‘WORKER’。
求:StrLength(s),StrLength(t),SubString(s, 8, 7),SubString(t, 2, 1),Index(s, ‘A’),Index(s, t),Replace(s, ‘STUDENT’, q),Concat(SubString(s, 6, 2), Concat(t, SubString(s, 7, 8)))。
4.4❶已知下列字符串a = ‘THIS’, f = ‘A SAMPLE’, c = ‘GOOD’, d = ‘NE’,b = ‘ ’.s = Concat(a, Concat(SubString(f, 2, 7), Concat(b, SubString(a, 3, 2)))),t = Replace(f, SubString(f, 3, 6), c),u = Concat(SubString(c, 3, 1), d),g = ‘IS’,v = Concat(s, Concat(b, Concat(t, Concat(b, u)))),试问:s,t,v,StrLength(s),Index(v, g),Index(u, g)各是什么?4.5❶试问执⾏以下函数会产⽣怎样的输出结果?void demonstrate(){StrAssign(s, ‘THIS IS A BOOK’);Replace(s, SubString(s, 3, 7), ‘ESE ARE’);StrAssign(t, Concat(s, ‘S’));StrAssign(u, ‘XYXYXYXYXYXY’);StrAssign(v, SubString(u, 6, 3));StrAssign(w, ‘W’);printf(‘t=’, t, ‘v=’, v, ‘u=’, Replace(u, v, w));}//demonstrate4.6❷已知:s = ‘(XYZ)+*’,t = ‘(X+Z)*Y’。
第四章 串----作业
“第四章串”自测作业单项选择题1.串的连接运算不满足。
A. 分配律B. 交换律C. 结合律D. 都不满足2.串是一种特殊的线性表,其特殊性体现在。
A. 可以顺序存储B. 数据元素是一个字符C. 可以链接存储D. 数据元素可以是多个字符3.设有两个串p和q,求q在p中首次出现的位置的运算称作。
A. 连接B. 模式匹配C. 求子串D. 求串长4.串是一个的序列。
A. 不少于一个字母B. 有限个字符C. 不少于一个字符D. 空格或字母5.已知串s=’ABCDEFGH’,则s的所有不同子串的个数为。
A. 8B. 9C. 36D. 376. 设串s1=’ABCDEFG’,s2=’PQRST’,函数concat(x,y)返回x 和y 串的连接串,substring(s,i,j)返回串s 的从序号i 的字符开始的j 个字符组成的子串,Strlength(s)返回串s 的长度,则concat(substing(s1,2,Strlength(s2)),substring(s1,len(s2),2))的结果串是。
A. BCDEFB. BCDEFGC. BCPQRSTD. BCDEFEF填空题1.两个串相等的充分必要条件是。
2.空格串是①,其长度等于②。
3.模式串‘abaabade’的next函数值为(请列表说明)。
4.在串S=’tuition’中,以t为首字符且值不相同的子串有个,它们是。
5. 使用“求子串”substring(S,pos,len)和“联接”concat(S1,S2)的串操作,可从串s=’conduction’中的字符得到串t=’cont’,则求t的串表达式为。
6. 已知字符串p=’abcabcabbac’,则next(3)和next(6)分别为①、②。
7. 设对主串’bcdbcddabcdbcdbac’和模式串’bcdbcdb’进行KMP模式匹配。
第1趟匹配失败后,则下一趟匹配将由主串的第①个字符与模式串的第__②___字符开始比较(字符串中字符从1开始编号)。
第四章 串
第四章串一、选择题1.函数substr(“DATASTRUCTURE”,5,9)的返回值为()。
A. “STRUCTURE”B.“DATA”C. “ASTRUCTUR”D. “DATASTRUCTURE”2.字符串的长度是指()。
A. 串中不同字符的个数B. 串中不同字母的个数C. 串中所含字符的个数D. 串中不同数字的个数3.两个字符串相等的充要条件是()。
A. 两个字符串的长度相等B. 两个字符串中对应位置上的字符相等C. 同时具备(A)和(B)两个条件D. 以上答案都不对4.关于串的叙述中,正确的是()A.空串是只含有零个字符的串B.空串是只含有空格字符的串C.空串是含有零个字符或含有空格字符的串D.串是含有一个或多个字符的有穷序列5.下面关于串的的叙述中,哪一个是不正确的?()A.串是字符的有限序列 B.空串是由空格构成的串C.模式匹配是串的一种重要运算 D.串既可以采用顺序存储,也可以采用链式存储6.设有两个串S1和S2,求S2在S1中首次出现的位置的运算称作( ) A.求子串 B.判断是否相等 C.模型匹配 D.连接7.若串S=’software’,其子串的数目是( )。
A.8 B.37 C.36 D.98.串的长度是指()A.串中所含不同字母的个数 B.串中所含字符的个数C.串中所含不同字符的个数 D.串中所含非空格字符的个数9.串是一种特殊的线性表,其特殊性体现在( )。
A.数据元素是一个字符 B. 可以顺序存储C. 数据元素可以是多个字符D. 可以链接存储10.下面关于串的的叙述中,哪一个是不正确的(B)A. 串是字符的有限序列B. 空串是由空格构成的串C. 模式匹配是串的一种重要运算D. 串既可以采用顺序存储,也可以采用链式存储11.若串=‘software’,其非平凡子串(非空且不同于串本身)的数目是(C)A. 8 B. 37 C. 35 D. 912.串是一种特殊的线性表,其特殊性体现在(B)A. 可以顺序存储B. 数组元素是一个字符C. 可以连续存储D. 数据元素可以是多个字符13. 下面关于串的的叙述中,哪一个是不正确的?(B)A.串是字符的有限序列B.空串是由空格构成的串C.模式匹配是串的一种重要运算D.串既可以采用顺序存储,也可以采用链式存储二、填空题1.两个串是相等的,当且仅当两个串的长度相等且___对应位置_____的字符都相同。
经济法串讲3(第四章)含答案
经济法串讲3(第四章)1. 【单选】根据增值税法律制度的规定,下列行为中,属于视同销售货物行为的是()。
(1分)A. 甲商贸公司将外购的矿泉水用于交际应酬B. 乙超市将外购的洗衣粉作为集体福利发给员工C. 丙玩具厂将自产的玩具无偿赠送给福利院D. 丁服装厂将外购的面料用于生产服装2. 【单选】根据增值税法律制度的规定,一般纳税人发生应税销售行为向购买方收取的下列款项中,不并入销售额计算销项税额的是()。
(1分)A. 返还利润B. 补贴C. 代收代缴的消费税D. 手续费3. 【单选】甲公司为增值税一般纳税人,2017年5月取得咨询服务不含税收入318万元,另收取奖励费5.3万元。
已知咨询服务增值税税率为6%。
计算甲公司业务增值税销项税额的下列算式中,正确的是()。
(1分)A. (318+5.3)÷(1+6%)×6%=18.3(万元)B. 318×6%=19.08(万元)C. [318+5.3÷(1+6%)]×6%=19.38(万元)D. 318÷(1+6%)×6%=18(万元)4. 【单选】某企业为增值税一般纳税人,2021 年 10 月销售自产电视机 10 台,开具增值税专用发票注明价款 30 000 元,另外取得延期付款利息 2 260 元。
已知电视机增值税税率为 13%,则该企业当月的销项税额为()元。
(1分)A. 4 800B. 5 174.4C. 4 160D. 05. 【单选】甲服装厂为增值税一般纳税人,2019年10月将自产的100件新型羽绒服作为福利发给本厂职工,该新型羽绒服生产成本为1 130元/件,无同类销售价格。
已知增值税税率为13%,成本利润率为10%。
计算甲服装厂当月该笔业务增值税销项税额的下列算式中,正确的是()。
(1分)A. 100×1 130×13%=14 690(元)B. 100×1 130×(1+10%)×13%=16 159(元)C. 100×1 130÷(1+13%)×13%=13 000(元)D. 100×1 130×(1+10%)÷(1+13%)×13%=14 300(元)6. 【单选】甲公司为增值税一般纳税人,本月将一批新研制的高档美白化妆品赠送给老顾客使用,甲公司并无同类产品销售价格,其他公司也无同类货物,已知该批产品的生产成本为10万元,甲公司的成本利润率为10%,高档化妆品的消费税税率为15%,增值税税率为13%,则甲公司当月该笔业务增值税销项税额的下列计算中,正确的是()。
第四章串(作业)
第四章串(作业)一、判断题1.如果两个串含有相同的字符,则说明它们相等。
2.如果一个串中的所有字符均在另一串中出现,那么则说明前者是后者的子串。
3.设有两个串P和Q,其中Q是P的子串,把Q在P中首次出现的位置作为子串Q在P中的位置的算法称为匹配。
4.单引号和双引号都可做为串的定界符。
5.单引号是串的一部分。
6.设s= ‘’,t= ‘✞’,则s=t二、选择题1.串是()。
A.少于一个字母的序列B.任意个字母的序列C.不少于一个字母的序列D.有限个字母的序列2.串的长度是()。
A.串中不同字母的个数B.串中不同字符的个数C.串中所含字符的个数,且大于0D.串中所含字符的个数3.设有两中串p和q,求q在p中首次出现的位置的运算( )。
A. 连接B.模式匹配C.求子串D. 求串长4.串的联结运算不满足()。
A.分配律B.交换律C.结合律5.设字符串s1=‘ABCDEFG’,s2=‘PQRST’,而T,sub1,sub2为空串,则运算S=Concation(T,SubString(sub1,s1,2,SubLength(s2)),SubString(sub2,s1,SubLeng th(s2),2))后的串T的值为()。
A.‘BCDEF’B.’BCDEFG’C.’BCPQRST’D.’BCDEFEF’E.’BCQR’三、填空题1.设s=‘I am a student’,t=‘good’,q=‘worker’。
则:StrLength(s)=(),SubString(s,8,7)=(),BFIndex(s,’a’)= (), BFIndex(s,t)=(), Concation (SubString (s,6,2),Concation(t, SubString(s,7,8)))=(), Replace(s,’student’,q)=()2.已知下列字符串:a=‘this’,f=‘a sample’, c=‘good’,d=‘ne’,b=‘✞’,g=‘is’。
第四章串 习题
第四章串习题一、选择题1.串是一种特殊的线性表,其特殊性体现在()A.可以顺序存储 B.数据元素是一个字符 C. 可以链式存储 D.数据元素可以是多个字符2. 空串与空格字符组成的串的区别在于()。
A.没有区别B.两串的长度不相等C.两串的长度相等D.两串包含的字符不相同3.有串S1=”ABCDEFG”, S2=”PQRST”, 假设函数con(x,y)返回x和y串的连接串,subs(s,i,j)返回串s的从数组序号为i(下标从0开始)的字符开始的j个字符组成的子串, len(s)返回串s 的长度,则con(subs(s1,2,len(s2)),subs(s1,len(s2),2))的结果串是( )A.BCDEFB.BCDEFGC.BCPQRSTD.CDEFGFG4.若串s=”sfotware”,其子串的个数是( )A.8B.37C.36D.95. 一个子串在包含它的主串中的位置是指()。
A.子串的最后那个字符在主串中的位置B.子串的最后那个字符在主串中首次出现的位置C.子串的第一个字符在主串中的位置D.子串的第一个字符在主串中首次出现的位置6. 下面的说法中,只有()是正确的。
A.字符串的长度是指串中包含的字母的个数B.字符串的长度是指串中包含的不同字符的个数C.若T包含在S中,则T一定是S的一个子串D.一个字符串不能说是其自身的一个子串7. 两个字符串相等的条件是()。
A.两串的长度相等B.两串包含的字符相同C.两串的长度相等,并且两串包含的字符相同D.两串的长度相等,并且对应位置上的字符相同8. 若SUBSTR(S,i,k)表示求S中从第i个字符开始的连续k个字符组成的子串的操作,则对于S=“Beijing&Nanjing”,SUBSTR(S,4,5)=()。
A. “ijing”B. “jing&”C. “ingNa”D. “ing&N”9. 若INDEX(S,T)表示求T在S中的位置的操作,则对于S=“Beijing&Nanjing”,T=“jing”,INDEX(S,T)=()。
第4章串答案.doc
一、选择题1如下陈述中正确的是(A).A.串是一种特殊的线性表B串的长度必须大于0C串中元素只能是字母D空串就是空格串2串的长度是指(B).A串中所有不同字母的个数B串中所有字符的个数c.串中所含不同字符的个数D串中所有非空格字符的个数3设有两个串p和q,求q在p中首次出现的位置的运算称作(B )oA连接B模式匹配C求子串D求串长4.( D )是(2语言中"abed 321ABCD "的子串.A. abedB. 321ABC. "abcABC"D. "21AB "5若串s=n sofrware n ,其子串的数目是(B37).A. 8B. 37C. 36D. 96下而关于串的叙述中,哪个是不正确的?( B ).A串是字符的有限序列B空串是由空格构成的串C模式匹配是串的一种重要运算D.串既可以采用顺序存储,也可以釆用链式存储7.设串S=n abcdefgh", S的所有非平凡子串的个数是(C )A. 8B. 37C. 36D. 358.设S为一个长度为n的字符串,其中的字符各不相同,s中的互异的非平凡子串的个数是(C)A.川B. % + % —1C. % + %D. % —% —19.设主串的长度为m,模式串的长度是n,串匹配的B算法时间复杂度是(D )A.o(n2)B・o(〃)C・ o(〃 + nt)D・o(m*n)10•顺序串中,根据空间分配方式的不同,可分为(B)A.直接分配和间接分配B.静态分配和动态分配C.顺序分配和链式分配D.随机分配和固定分配二、基本知识题1空串与空格串有何区别?空串是指长度是零的串,空格串中可以包含一个或多个空白符2己知有两个串为A= n ac cab cabcbbca"B="abc"判断B串是否是A串的子串,如果是其子串,说明起始点是A 串的第几个字符。
是93.串是一种特殊的线性表,其特殊性体现在什么地方?数据元素是一个字符4串的两种基本的存储方式是什么?顺序和链接5两个串相等的充分必要条件是什么?串长相等且对应位置的字符相同三、算法设计题1对于采用顺序结构有储的串r,编写一个函数删除其值等于ch 的所有字符.2对于采用顺序结构有储的串r,编写一个函数删除r中第i个字符开始的j个字符.3对于采用顺序结构有储的串r,设计一算法将串逆置.4采用单链表结构存储的串r ,编写一个函数将其中所有的'c,宇符替挟成's,宇符.5己如两个采用单链表结构存储的串A和 B o试编写个函数将串B插入串A中第k个字符之后。
算法与数据结构考研试题精析(第二版)第4章串答案概要
第四章串一、选择题1.B 2.E 3.C 4.A5.C6.A7.1D 7.2F 8.B注9.D 10.B注:子串的定义是:串中随意个连续的字符构成的子序列,并规定空串是随意串的子串,随意串是其自己的子串。
若字符串长度为n(n>0),长为n的子串有1个,长为n-1的子串有2个,长为n-2的子串有3个,,,,长为1的子串有n个。
因为空串是任何串的子串,所以此题的答案为:8*(8+1)/2+1=37。
应选B。
但某些教科书上以为“空串是随意串的子串”无心义,所以以为选C。
为防止考试中的二意性,编者以为第9题出得好。
二、判断题1.√2.√3.√三.填空题1.(1)由空格字符(ASCII值32)所构成的字符串(2)空格个数23.随意个连续的字符构成的子序列4.5 5.O(m+n) 6.011223127.010104218.(1)模式般配(2)模式串.字符9.(1)其数据元素都是字符(2)次序储存(3)和链式储存(4)串的长度相等且两串中对应地点的字符也相等10.两串的长度相等且两串中对应地点的字符也相等。
11.’xyxyxywwy’12.*s++=*t++或(*s++=*t++)!=‘\0’13.(1)chars[] (2)j++ (3)i>=j14.[题目剖析]此题算法采纳次序储存构造求串s和串t的最大公共子串。
串s 用i指针(1<=i<=s.len)。
t串用j指针(1<=j<=t.len)。
算法思想是对每个i(1<=i<=s.len,即程序中第一个WHILE循环),来求从i开始的连续字符串与从j(1<=j<=t.len,即程序中第二个WHILE循环)开始的连续字符串的最大般配。
程序中第三个(即最内层)的WHILE循环,是当s中某字符(s[i])与t中某字符(t[j])相等时,求出局部公共子串。
若该子串长度大于已求出的最长公共子串(初始为0),则最长公共子串的长度要改正。
《数据结构及其应用》笔记含答案 第四章_串、数组和广义表
第4章串、数组和广义表一、填空题1、零个或多个字符组成的有限序列称为串。
二、判断题1、稀疏矩阵压缩存储后,必会失去随机存取功能。
(√)2、数组是线性结构的一种推广,因此与线性表一样,可以对它进行插入,删除等操作。
(╳)3、若采用三元组存储稀疏矩阵,把每个元素的行下标和列下标互换,就完成了对该矩阵的转置运算。
(╳)4、若一个广义表的表头为空表,则此广义表亦为空表。
(╳)5、所谓取广义表的表尾就是返回广义表中最后一个元素。
(╳)三、单项选择题1、串是一种特殊的线性表,其特殊性体现在(B)。
A.可以顺序存储B.数据元素是一个字符C.可以链式存储D.数据元素可以是多个字符若2、串下面关于串的的叙述中,(B)是不正确的?A.串是字符的有限序列B.空串是由空格构成的串C.模式匹配是串的一种重要运算D.串既可以采用顺序存储,也可以采用链式存储解释:空格常常是串的字符集合中的一个元素,有一个或多个空格组成的串成为空格串,零个字符的串成为空串,其长度为零。
3、串“ababaaababaa”的next数组为(C)。
A.012345678999 B.012121111212 C.011234223456 D.01230123223454、串“ababaabab”的nextval为(A)。
A.010104101B.010102101 C.010100011 D.0101010115、串的长度是指(B)。
A.串中所含不同字母的个数B.串中所含字符的个数C.串中所含不同字符的个数D.串中所含非空格字符的个数解释:串中字符的数目称为串的长度。
6、假设以行序为主序存储二维数组A=array[1..100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=(B)。
A.808 B.818 C.1010 D.1020解释:以行序为主,则LOC[5,5]=[(5-1)*100+(5-1)]*2+10=818。
第4章 串
一、选择题1.若串S=‘software’,其子串的数目是。
A.8 B.37 C.36 D.92.串的长度是指。
A.串中所含不同字母的个数 B.串中所含字符的个数C.串中所含不同字符的个数 D.串中所含非空格字符的个数3.串是一种特殊的线性表,其特殊性体现在。
A.可以顺序存储 B.数据元素是一个字符C.可以链式存储 D.数据元素可以是多个字符4.设有两个串p和q,求q在p中首次出现的位置的运算称为。
A.连接 B.模式匹配 C.求子串 D.求串长二、填空题1.空串是,其长度等于。
空格串是,其长度等于。
2.组成串的数据元素只能是。
3.一个字符串中称为该串的子串。
4.子串”str”在主串”datastructure”中的位置是。
5. 子串的定位运算称为;被匹配的主串称为,子串称为。
4.1 简述下列每对术语的区别:空串和空格串;串常量和串变量;主串和子串;静态分配的顺序串和动态分配的顺序串(即:定长顺序存储和堆分配存储);目标串和模式串。
4.2 假设有如下的串说明:char s1[30]="Stocktom,CA", s2[30]="March 5 1999", s3[30], *p;(1)在执行如下的每个语句后p的值是什么?p=strchr(s1,'t'); p=strchr(s2,'9'); p=strchr(s2,'6');(2)在执行下列语句后,s3的值是什么?strcpy(s3,s1); strcat(s3,","); strcat(s3,s2);(3)调用函数strcmp(s1,s2)的返回值是什么?(4)调用函数strcmp(&s1[5],"ton")的返回值是什么?(5)调用函数strlen(strcat(s1,s2))的返回值是什么?4.3和4.4 二选一:*4.3利用C的库函数strlen,strcpy和strcat写一算法voidStrInsert(char *S, char *T, int i),将串T插入到串S的第i个位置上。
第4章 字符串 习题参考答案
第4章串习题参考答案一、基础知识题4.1 简述下列每对术语的区别:空串和空格串;串常量与串变量;主串和子串;串变量的名字和串变量的值;静态分配的顺序串与动态分配的顺序串。
【解答】不含任何字符的串称为空串,其长度为0。
仅含有空格字符的串称为空格串,其长度为串中空格字符的个数。
空格符可用来分割一般的字符,便于人们识别和阅读,但计算串长时应包括这些空格符。
空串在串处理中可作为任意串的子串。
用引号(数据结构教学中通常用单引号,而C语言中用双引号)括起来的字符序列称为串常量,串值可以变化的量称为串变量。
串中任意个连续的字符组成的子序列被称为该串的子串。
包含子串的串又被称为该子串的主串。
子串在主串中第一次出现的第一个字符的位置称子串在主串中的位置。
串变量的与其它变量一样,要用名字引用其值,串变量的名字也是标识符,串变量的值可以修改。
串的存储也有静态存储和动态存储两种。
静态存储指用一维数组,通常一个字符占用一个字节,需要静态定义串的长度,具有顺序存储结构的优缺点。
若需要在程序执行过程中,动态地改变串的长度,则可以利用标准函数malloc()和free()动态地分配或释放存储单元,提高存储资源的利用率。
在C语言中,动态分配和回收的存储单元都来自于一个被称之为“堆”的自由存储区,故该方法可称为堆分配存储。
类型定义如下所示:typedef struct{ char *str;int length;}HString;4.2设有串S=’good’,T=’I︼am︼a︼student’,R=’!’,求:(1)StringConcat(T,R) (2)SubString(T,8,7)(3)StringLength(T) (4)Index(T,’a’)(5)StringInsert(T,8,S)(6)Replace(T,SubString(T,8,7),’teacher’)【解答】(1) StringConcat(T,R)=’I︼am︼a︼student!’(2) SubString(T,8,7)=’student’(3) StringLength(T)=14(4) Index(T,’a’)=3(5) StringInsert(T,8,S)=’I︼am︼a︼goodstudent’(6) Replace(T,SubString(T,8,7),’teacher’)= ’I︼am︼a︼teacher’4.3若串S1=‘ABCDEFG’,S2=‘9898’,S3=‘###’,S4=‘012345’,执行concat(replace(S1,substr(S1,length(S2),length(S3)),S3),substr(S4,index(S2,‘8’),length(S2))) 操作的结果是什么?【解答】concat(replace(S1,substr(S1,length(S2),length(S3)),S3),substr(S4,index(S2,‘8’),length(S2))) = concat(replace(S1,substr(S1,4,3),S3),substr(S4,2,4))= concat(replace(S1,’DEF’,S3),’1234’)= concat(‘ABC###G ’,’1234’)= ‘ABC###G1234’4.4 设S 为一个长度为n 的字符串,其中的字符各不相同,则S 中的互异的非平凡子串(非空且不同于S 本身)的个数是多少?【解答】长度为n 的字符串中互异的非平凡子串(非空且不同于S 本身)的个数计算如下: 长度为1的子串有n 个,长度为2的子串有n-1个,长度为3的子串有n-2个,……,长度为n-1的子串有2个,长度为n 的子串有1个(按题意要求这个子串就是S 本身,不能计算在总数内)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四章串一、选择题注:子串的定义是:串中任意个连续的字符组成的子序列,并规定空串是任意串的子串,任意串是其自身的子串。
若字符串长度为n(n>0),长为n的子串有1个,长为n-1的子串有2个,长为n-2的子串有3个,……,长为1的子串有n个。
由于空串是任何串的子串,所以本题的答案为:8*(8+1)/2+1=37。
故选B。
但某些教科书上认为“空串是任意串的子串”无意义,所以认为选C。
为避免考试中的二意性,编者认为第9题出得好。
三.填空题1.(1) 由空格字符(ASCII值32)所组成的字符串 (2)空格个数 2.字符3.任意个连续的字符组成的子序列 4.5 5.O(m+n)6.01122312 7.01010421 8.(1)模式匹配 (2)模式串9.(1)其数据元素都是字符(2)顺序存储(3)和链式存储(4)串的长度相等且两串中对应位置的字符也相等10.两串的长度相等且两串中对应位置的字符也相等。
11.’xyxyxywwy’ 12.*s++=*t++ 或(*s++=*t++)!=‘\0’13.(1)char s[ ] (2) j++ (3) i >= j14.[题目分析]本题算法采用顺序存储结构求串s和串t的最大公共子串。
串s用i指针(1<=i<=s.len)。
t串用j指针(1<=j<=t.len)。
算法思想是对每个i(1<=i<=s.len,即程序中第一个WHILE循环),来求从i开始的连续字符串与从j(1<=j<=t.len,即程序中第二个WHILE循环)开始的连续字符串的最大匹配。
程序中第三个(即最内层)的WHILE 循环,是当s中某字符(s[i])与t中某字符(t[j])相等时,求出局部公共子串。
若该子串长度大于已求出的最长公共子串(初始为0),则最长公共子串的长度要修改。
程序(a):(1)(i+k<=s.len)AND(j+k<=t.len) AND(s[i+k]=t[j+k])//如果在s和t的长度内,对应字符相等,则指针k 后移(加1)。
(2)con:=false //s和t对应字符不等时置标记退出(3)j:=j+k //在t串中,从第j+k字符再与s[i]比较(4)j:=j+1 //t串取下一字符(5)i:=i+1 //s串指针i后移(加1)。
程序(b):(1) i+k<=s.len && j+k<=t.len && s[i+k]==t[j+k] //所有注释同上(a)(2) con=0 (3) j+=k (4) j++ (5) i++15.(1)0 (2)next[k]16.(1)i:=i+1 (2)j:=j+1 (3)i:=i-j+2 (4)j:=1; (5)i-mt(或i:=i-j+1) (6)017.程序中递归调用(1)ch1<>midch //当读入不是分隔符&和输入结束符$时,继续读入字符(2)ch1=ch2 //读入分隔符&后,判ch1是否等于ch2,得出真假结论。
(3)answer:=true(4)answer:=false(5)read(ch)(6)ch=endch18.(1)initstack(s) //栈s初始化为空栈。
(2) setnull (exp) //串exp初始化为空串。
(3) ch in opset //判取出字符是否是操作符。
(4) push (s,ch) //如ch是运算符,则入运算符栈s。
(5) sempty (s) //判栈s是否为空。
(6) succ := false //若读出ch是操作数且栈为空,则按出错处理。
(7) exp (8)ch //若ch是操作数且栈非空,则形成部分中缀表达式。
(9) exp (10) gettop(s) //取栈顶操作符。
(11) pop(s) //操作符取出后,退栈。
(12) sempty(s) //将pre的最后一个字符(操作数)加入到中缀式exp的最后。
四.应用题1.串是零个至多个字符组成的有限序列。
从数据结构角度讲,串属于线性结构。
与线性表的特殊性在于串的元素是字符。
2.空格是一个字符,其ASCII码值是32。
空格串是由空格组成的串,其长度等于空格的个数。
空串是不含任何字符的串,即空串的长度是零。
3.最优的T(m,n)是O(n)。
串S2是串S1的子串,且在S1中的位置是1。
开始求出最大公共子串的长度恰是串S2的长度,一般情况下,T(m,n) =O(m*n)。
4.朴素的模式匹配(Brute-Force)时间复杂度是O(m*n),KMP算法有一定改进,时间复杂度达到O(m+n)。
本题也可采用从后面匹配的方法,即从右向左扫描,比较6次成功。
另一种匹配方式是从左往右扫描,但是先比较模式串的最后一个字符,若不等,则模式串后移;若相等,再比较模式串的第一个字符,若第一个字符也相等,则从模式串的第二个字符开始,向右比较,直至相等或失败。
若失败,模式串后移,再重复以上过程。
按这种方法,本题比较18次成功。
5.KMP算法主要优点是主串指针不回溯。
当主串很大不能一次读入内存且经常发生部分匹配时,KMP算法的优点更为突出.6.模式串的next函数定义如下:next[j]=⎪⎩⎪⎨⎧=<<=-+--其它情况当此集合不空时‘且时当1}'...''...jk1|kmax{11111jkjkppppj根据此定义,可求解模式串t的next和nextval值如下:7.解法同上题6,其next和nextval值分别为0112123422和010*******。
8.解法同题6,t串的next和nextval函数值分别为0111232和0110132。
9.解法同题6,其next和nextval 值分别为011123121231和011013020131。
10.p1的next和nextval值分别为:0112234和0102102;p2的next和nextval值分别为:0121123和0021002。
11.next数组值为011234567 改进后的next数组信息值为010101017。
12.011122312。
13.next定义见题上面6和下面题20。
串p的next函数值为:01212345634。
14.(1)S的next与nextval值分别为012123456789和002002002009,p的next与nextval值分别为012123和002003。
(2)利用BF算法的匹配过程:利用KMP算法的匹配过程:第一趟匹配: aabaabaabaac 第一趟匹配:aabaabaabaacaabaac(i=6,j=6) aabaac(i=6,j=6)第二趟匹配: aabaabaabaac 第二趟匹配:aabaabaabaacaa(i=3,j=2) (aa)baac第三趟匹配: aabaabaabaac 第三趟匹配:aabaabaabaaca(i=3,j=1) (成功) (aa)baac第四趟匹配: aabaabaabaacaabaac(i=9,j=6)第五趟匹配: aabaabaabaacaa(i=6,j=2)第六趟匹配: aabaabaabaaca(i=6,j=1)第七趟匹配: aabaabaabaac(成功) aabaac(i=13,j=7)15.(1)p的nextval函数值为0110132。
(p的next函数值为0111232)。
(2)利用KMP(改进的nextval)算法,每趟匹配过程如下:第一趟匹配: abcaabbabcabaacbacbaabcab(i=5,j=5)第二趟匹配: abcaabbabcabaacbacbaabc(i=7,j=3)第三趟匹配: abcaabbabcabaacbacbaa(i=7,j=1)第四趟匹配: abcaabbabcabaac bacba(成功) abcabaa(i=15,j=8)16.KMP算法的时间复杂性是O(m+n)。
p的next和nextval值分别为01112212321和01102201320。
17.(1)p的nextval函数值为01010。
(next函数值为01123)(2)利用所得nextval数值,手工模拟对s的匹配过程,与上面16题类似,为节省篇幅,故略去。
18.模式串T的next和nextval值分别为0121123和0021002。
19.第4行的p[J]=p[K]语句是测试模式串的第J个字符是否等于第K个字符,如是,则指针J和K均增加1,继续比较。
第6行的p[J]=p[K]语句的意义是,当第J个字符在模式匹配中失配时,若第K个字符和第J个字符不等,则下个与主串匹配的字符是第K个字符;否则,若第K个字符和第J个字符相等,则下个与主串匹配的字符是第K个字符失配时的下一个(即NEXTVAL[K])。
该算法在最坏情况下的时间复杂度O(m2)。
20.(1)当模式串中第一个字符与主串中某字符比较不等(失配)时,next[1]=0表示模式串中已没有字符可与主串中当前字符s[i]比较,主串当前指针应后移至下一字符,再和模式串中第一字符进行比较。
(2)当主串第i个字符与模式串中第j个字符失配时,若主串i不回溯,则假定模式串第k个字符与主串第i个字符比较,k值应满足条件1<k<j并且‘p1…p k-1’=‘p j-k+1…p j-1’,即k为模式串向后移动的距离,k值有多个,为了不使向右移动丢失可能的匹配,k要取大,由于max{k}表示移动的最大距离,所以取max{k},k的最大值为j-1。
(3)在上面两种情况外,发生失配时,主串指针i不回溯,在最坏情况下,模式串从第1个字符开始与主串第i 个字符比较,以便不致丢失可能的匹配。
21.这里失败函数f,即是通常讲的模式串的next函数,其定义见本章应用题的第6题。
进行模式匹配时,若主串第i个字符与模式串第j个字符发生失配,主串指针i不回溯,和主串第i个字符进行比较的是模式串的第next[j]个字符。
模式串的next函数值,只依赖于模式串,和主串无关,可以预先求出。
该算法的技术特点是主串指针i不回溯。
在经常发生“部分匹配”和主串很大不能一次调入内存时,优点特别突出。
22.失败函数(即next)的值只取决于模式串自身,若第j个字符与主串第i个字符失配时,假定主串不回溯,模式串用第k(即next[j])个字符与第i个相比,有‘ p1…p k-1’=‘p j-k+1…p j-1’,为了不因模式串右移与主串第i个字符比较而丢失可能的匹配,对于上式中存在的多个k值,应取其中最大的一个。
这样,因j-k最小,即模式串向右滑动的位数最小,避免因右移造成的可能匹配的丢失。