字符串去重合并2

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int GetMacSubStr(const char* S1,const char* S2, char* maxSubStr) {
	int i,j,x,y,k,s,n=strlen(S1),m=strlen(S2);
//分别为遍历长度变量,遍历s1起点变量,遍历s2起点变量,遍历检测变量,
//答案起点记录变量,答案长度记录变量,s1长度变量,s2长度变量 
	for(i=1; i<=n&&i<=m; i++) {//先检测长度为1的字符串是否最长公共 
		for(x=0; x+i<=n; x++)//第一次检测从0位置做为起点 
			for(y=0; y+i<=m; y++) {//第一次检测从0位置做为起点 
				for(j=0; j<i; j++)//要求长度为i的连续相等 
					if(S1[x+j]!=S2[y+j])break;//一次失败就退出 
				if(j==i) {//根据是否是中途退出判断是否成功,成功就记录 
					k=x;
					s=i;
				}
			}
	}
	if(s==0)return -1;//根据长度判断是否找到 
	strcpy(maxSubStr,S1+k);//存入答案 
	maxSubStr[s]=0;//在末尾加上结束标志 
	return 0;//返回成功 
}
int mergeStr(const char* S1, const char* S2,  char* Mergedstr){
	int i,j,x,y,k,s,d,n=strlen(S1),m=strlen(S2),nm=strlen(Mergedstr);
	//循环字符串变量,循环最大子串变量,最终结果数组长度变量,
	//s1长度变量,s2长度变量,最大子串长度变量 
	char st[999];//答案字符串 
	for(i=1; i<=n&&i<=m; i++) {//先检测长度为1的字符串是否最长公共 
		for(x=0; x+i<=n; x++)//第一次检测从0位置做为起点 
			for(y=0; y+i<=m; y++) {//第一次检测从0位置做为起点 
				for(j=0; j<i; j++)//要求长度为i的连续相等 
					if(S1[x+j]!=S2[y+j])break;//一次失败就退出 
				if(j==i) {//根据是否是中途退出判断是否成功,成功就记录 
					k=x;
					s=i;
				}
			}
	}
	strcpy(Mergedstr,S1+k);//存入答案 
	Mergedstr[s]=0;//在末尾加上结束标志 
	if(k==0)return -1;//判断是否为空 
	for(i=0,d=0;i<n;i++){//循环检测每个位置 
		for(j=0;j<nm;j++){//是否是子串 
			if(Mergedstr[j]!=S1[i+j])
				break;
		}
		if(j!=nm)st[d++]=S1[i];//根据结束后状态判断是怎么结束的 
		else i+=k-1;//如果是完整结束,则跳过这个最大子串 
	}
	for(i=0;i<m;i++){
		for(j=0;j<nm;j++){
			if(Mergedstr[j]!=S2[i+j])
				break;
		}
		if(j!=nm)st[d++]=S2[i];
		else i+=k-1;
	}
	st[d]=0;//末尾加上0 
	strcpy(Mergedstr,st);//转发 
	return 0;
}
void Clear(char* S1,char* S2,char* maxSubStr){//清空 
	free(S1);
	free(S2);
	free(maxSubStr);
}
int main() {
	char *a=(char*)malloc(sizeof(char)*999),*b=(char*)malloc(sizeof(char)*999),*c=(char*)malloc(sizeof(char)*999);
	scanf("%s%s",a,b);
	GetMacSubStr(a,b,c);
	puts(c);
	mergeStr(a,b,c);
	puts(c);
	Clear(a,b,c);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值