第一题是:写一函数,实现删除字符串str1中含有的字符串str2。这一题不难,但是有个 KMP优化算法,大家有兴趣可以查看资料看一下。
第二题是:给定的字符串A和B,输出A和B中的最大公共子串。本人的代码是:
#include
#include
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
{
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) //如果……,那么返回shortstring
return 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);
else
comman=commanstring(str1, str2);
printf("the longest comman string is: %s\n", comman);
}
该算法其中的精髓就在于strstr()这个函数,在此学习了