关于C语言字符串操作的几个题目

本文探讨了C++中优化字符串操作的两种方法:KMP算法和最大公共子串查找。通过实验证明,使用KMP算法进行字符串删除操作更高效;而最大公共子串的查找则涉及到字符串匹配算法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一题是:写一函数,实现删除字符串str1中含有的字符串str2。这一题不难,但是有个 KMP优化算法,大家有兴趣可以查看资料看一下。

第二题是:给定的字符串AB,输出AB中的最大公共子串。本人的代码是:

#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) //如果……,那么返回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()这个函数,在此学习了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值