今天去面试,面试官出了一道题,求两个字符串的最大公共子串,一听起来不是很难,但让我在纸上写着写着就迷糊了。回来特意写了一下:
1.用C++实现
#include <iostream>
#include <string>
using namespace std;
void maxstr(string str1,string str2)
{
int i,j,k;
string max,str;
for (i=0;i<str1.length();i++)
{
for (j=0;j<=str1.length();j++)
{
str=str1.substr(i,j);
if(str2.find(str,0)<str2.length())
{
if (str.length()>max.length())
{
max=str;
}
}
}
}
cout<<max;
}
void main()
{
string str1,str2;
cin>>str1>>str2;
maxstr(str1,str2);
}
2.C语言实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* longest(char *a,char *b)
{
int alen = strlen(a);
int blen = strlen(b);
int i,j,index,max=0,num=0;
int start;
for(i = 0; i < alen; i++)
{
for(j = 0; j < blen; j++)
{
//这里的start1、start2是比较关键的
int start1=i;
int start2=j;
while((start1 <= alen-1) && (start2 <= blen-1) && (a[start1++] == b[start2++]))
num++;
if(num > max)//如果num是当前最大匹配的个数,则赋给max,并且在start记下str1最长匹配开始的位置
{
max=num;
start=i;
}
num=0;//如果num不是当前最大的,则赋为0值继续循环
}
}
char *str=(char *)malloc(max + 1);
strncpy(str,a + start,max);//从字符串a的start位置开始,拷贝max个字符到str中,这就是我们找出的最大子串
str[max] = '\0';
return str;
}
int main()
{
char a[]="abcdabcdcbadffdaccccafg";
char b[]="gfaccccadffdabcdcbadcba";
char *str;
str = longest(a,b);
printf("%s\n",str);
free(str); //之前这里忘记free了,造成内存泄露了
system("pause");
return 0;
}