您的位置:首页 > 其它

两个字符串的最大公共子串

2014-09-26 21:04 393 查看
今天去面试,面试官出了一道题,求两个字符串的最大公共子串,一听起来不是很难,但让我在纸上写着写着就迷糊了。回来特意写了一下:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: