利用后缀数组找字符串中相同且长度最长的字符串

本文介绍了一种寻找字符串中最长重复子串的算法实现。通过构造后缀数组并进行比较,该算法能够有效地找出给定字符串中的最长重复部分。文章详细展示了算法的流程和核心代码。

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

int con_sub(char *str,char *ret)
{
	int max_len=0;//记录最大长度
	int temp_len=1;
	int len=strlen(str);
	char** next=(char**)malloc(sizeof(char *)*len);
	for (int i=0;i<len;i++)//后缀数组
	{
		next[i]=str+i;
	}
	for (int k=1;k<(len+1)/2;k++)//相等大小不会大于一半,相等大小的控制
	{
		for (int i=0;i<len-1;i++)//从头开始比较,控制第i个子串与后面的比较
		{
			temp_len=1;
			for (int j=0;i+k+j<=len-1;j++)//用于比较不相邻的字串是否相等,控制后面被比较的子串
			{
				if (strncmp(next[i],next[i+k+j],k)==0)//跨度为k进行比较前k个字符,找到一个相等的,立即进入下一个k值比较,如果不等next[i+k+j]往下移动一位,由j控制
				{
					temp_len=k;
					break;
				}
			}
	   if (temp_len>max_len)
			{
				max_len=temp_len;
				strncpy(ret,str+i,max_len);//把最大的重复字符串保存起来
				break;
			}
		}
	} 
	return max_len;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值