资源描述:
《c语言高级程序设计(下)ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、C语言高级程序设计(下)1第4章字符串部分2例4.1例4.1编写一个函数,找出字符串str1与str2的所有最长公共子串。3例4.1首先,判定两个串是否有长为j的子串的方法是:对串1从左至右的的每一个子串,都与串2的从左至右的每一个子串进行比较。考虑“bsdefg”与“asdefsdefsrt”的公共子串4例4.1本例是计算最长的公共子串,这里的方法是从可能的最长的子串的长度开始考虑,即从j=min(strlen(str1),strlen(str2))开始,看是否有这个长度的公共子串,如果有,则肯
2、定是最长的,否则再对j-1尝试,直至j减至0为止。5intsubstr(char*str1,char*str2,int*len){char*s1,*s2;/*分别表示长、短串*/intlen1,len2,k,j,i,l,count=0;len1=strlen(str1);len2=strlen(str2);s1=len1>len2?str1:str2;s2=len1>len2?str2:str1;len2=len1>len2?len2:len1;for(j=len2;j>0;j--){/*从最有可
3、能的长子串开始*/for(k=0;k+j<=len2;k++){for(i=0;s1[i+j-1]!=' ';i++){for(l=0;l0)break;}*len=(count>0)?j:0;returncount;}6例4.2例4.2采用顺序结构存储串。试编写一个实现串通配符匹配的函数
4、pindex(),其中的通配符只有‘?’,它可以和任何一字符匹配成功,例如:pindex(“?re”,”thereare”)返回的结果是2。7intpindex(char*substr,char*str){inti,j,k;for(i=0;str[i];i++)for(j=i,k=0;str[j]==substr[k]
5、
6、substr[k]=='?';j++,k++)if(!substr[k+1])returni;return-1;}8例4.3例4.3试编写一个函数intlike(charstr,
7、charpattern),该函数实现字符串匹配功能,str为被匹配的字符串,pattern是匹配模式,匹配模式有以下几种情况:(1)_(下划线)和?:表示通配1位任意字符;(2)*和%:表示通配0个、1个或多个任意字符;(3)转义符:-?*%\表示精确匹配,而不是通配;其它字符为精确匹配;通配符可以多次出现。9例4.3提示:(1)_(下划线)和?:不必比较,模式串与待比串分别向前移一位;(2)*和%:通配0个、1个或多个任意字符,此时模式串前移一位,而待比串移至与模式串相同符号的位置。
8、但有可能所移到的位置并不是真正匹配的位置,因此要保存“*”、“%”后面字符的位置,若模式串有这种通配符,也可以恢复模式串到保留的“*”、“%”位置,继续与待比串匹配;(3)转义符:-?*%\表示精确匹配,此时设标记,并将模式串前移一位;10for(j=0,k=0;;){for(;str[j]==pattern[k]
9、
10、!accurateFlag&&(pattern[k]=='?'
11、
12、pattern[k]=='_'
13、
14、pattern[k]=='*'
15、
16、pattern[k]=='%'
17、
18、p
19、attern[k]=='\');){if(str[j]==pattern[k]){j++;k++;accurateFlag=0;}else{if(pattern[k]=='\'){/*转义符处理*/k++;/*模式串前移*/accurateFlag=1;/*设标记,以使循环条件成立*/}else{if(pattern[k]=='?'
20、
21、pattern[k]=='_'){/*’?’、’_’的处理*/j++;k++;}else{/*’*’,’%’的处理*/posK=k++;/*保存’*’,’%’的
22、位置*/while(pattern[k]!=str[j]&&str[j]!=' ')j++;if(pattern[k]!=str[j]
23、
24、str[j]==' ')break;}if(!pattern[k]&&!str[j])return1;/*成功结束*/elseif(!pattern[k])break;/*模式串结束但待比串未结束,不一定终止*/elseif(!str[j])return0;/*待比串结束但模式串不结束,不匹配*/}if(posK==-1)break;/*若无