第一題是:寫一函數,實現刪除字串str1中含有的字串str2。這一題不難,但是有個 KMP最佳化演算法,大家有興趣可以查看資料看一下。
第二題是:給定的字串A和B,輸出A和B中的最大公用子串。本人的代碼是:
#include<stdio.h>#include<string.h>void UtMost_ComStr(char* s1,char* s2)//imagine: s1 is longer{int maxLength=0,length=0,i=0;char *p1=s1,*p1_1=s1,*p2=s2,*p2_2=s2;;char *maxStartAddr=s1;while(*p1!=0){if(*p1==*p2){length++;if(length>maxLength){maxLength=length;maxStartAddr=p1_1;}p1++;p2++;}else if((*p1!=*p2)&& *p2!=0){length=0;p1=p1_1;p2_2++;p2=p2_2;}else if(*p2==0){length=0;p1_1=s1++;p1=p1_1;p2_2=s2;p2=p2_2;}}printf("Max Length is %d\n",maxLength);printf("The longest same string is:\n");while(i<maxLength){putchar(*maxStartAddr);i++;maxStartAddr++;}}void main(){char *s1="aocdfe";char *s2="pmcdfa";UtMost_ComStr(s1,s2);}本人又從網上看了別人寫的演算法,發現有幾個操作字串很方便的函數:如下
char *commanstring(char shortstring[], char longstring[]){int i, j;char *substring=malloc(256);if(strstr(longstring, shortstring)!=NULL) //如果……,那麼返回shortstringreturn shortstring;for(i=strlen(shortstring)-1;i>0; i--) //否則,開始迴圈計算{for(j=0; j<=strlen(shortstring)-i; j++){memcpy(substring, &shortstring[j], i);substring[i]='\0';if(strstr(longstring, substring)!=NULL)return substring;}}return NULL;}main(){char *str1=malloc(256);char *str2=malloc(256);char *comman=NULL;gets(str1);gets(str2);if(strlen(str1)>strlen(str2)) //將短的字串放前面comman=commanstring(str2, str1);elsecomman=commanstring(str1, str2);printf("the longest comman string is: %s\n", comman);}
該演算法其中的精髓就在於strstr()這個函數,在此學習了