#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); }
字符串去重合并2
最新推荐文章于 2024-01-07 18:39:32 发布