题解 | #查找两个字符串a,b中的最长公共子串#
查找两个字符串a,b中的最长公共子串
https://www.nowcoder.com/practice/181a1a71c7574266ad07f9739f791506
注意是较小串中首次出现的
附上较大串中首次出现和较小串首次出现的代码
#include <stdio.h> #include <string.h> void jiaohuan(char str1[],int length1,char str2[],int length2) { char str[301]; int i; for(i=0;i<length1;i++) str[i]=str1[i]; for(i=0;i<length2;i++) str1[i]=str2[i]; str1[i]='\0'; for(i=0;i<length1;i++) str2[i]=str[i]; str2[i]='\0'; } /*int compare(char str1[],int length1,char str2[],int length2,int max)//长串中先出现的 { int i,j,jud; for(i=0;i<length1-max+1;i++) { if(max==length2) { for(j=0;j<length2;j++) { jud=1; for(int k=0;k<max;k++) if(str1[i+k]!=str2[j+k]) {jud=0;break;} if(jud==1) { for(int k=0;k<max;k++) printf("%c",str2[i+k]); return 1; } } } else { for(j=0;j<length2-max+1;j++) { jud=1; for(int k=0;k<max;k++) if(str1[i+k]!=str2[j+k]) {jud=0;break;} if(jud==1) { for(int k=0;k<max;k++) printf("%c",str1[i+k]); return 1; } } } } return 0; }*/ int compare(char str1[],int length1,char str2[],int length2,int max)//短串中先出现 { int i,j,jud; for(i=0;i<length2-max+1;i++) for(j=0;j<length1-max+1;j++) { jud=1; for(int k=0;k<max;k++) if(str2[i+k]!=str1[j+k]) {jud=0;break;} if(jud==1) { for(int k=0;k<max;k++) printf("%c",str2[i+k]); return 1; } } return 0; } int main() { char str_sh[301],str_l[301]; scanf("%s%s",str_sh,str_l); int length1,length2; length1=strlen(str_sh); length2=strlen(str_l); int max=length1; if(max>length2) { max=length2; jiaohuan(str_sh, length1, str_l, length2); } length1=strlen(str_sh); length2=strlen(str_l); while(max) { if(compare(str_l, length2, str_sh, length1, max)) break; max--; } return 0; }