2017年校招全国统一模拟笔试(第二场)编程题集合的一道题,求两个字符串的最长公共连续子序列的长度
题目地址第一题
下面是c++代码
#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
int m[100][100];
int main(){//freopen("1.txt","r",stdin);
int i,j,k1,k2,n,ans=0,max;
string s1,s2;
getline(cin,s1);
getline(cin,s2);
k1=s1.size();
k2=s2.size();
mem(m,0);
for(i=0;i<k1;i++)
for(j=0;j<k2;j++)
if(s1[i]==s2[j])m[i][j]=1;
for(i=0;i<k1;i++){
max=0;
for(j=0;j<k2;j++){
if(m[i+j][j]==1)max++;
else max=0;
if(max>ans)ans=max;
}
}//统计从左边第一列开始的斜向右下斜线的最大值
for(i=0;i<k2;i++){
max=0;
for(j=0;j<k1;j++){
if(m[j][i+j]==1)max++;
else max=0;
if(max>ans)ans=max;
}
}//统计从顶部第一行开始的斜向右下斜线的最大值
printf("%d\n",ans);
/*
for(i=0;i<k1;i++){
for(j=0;j<k2;j++)
printf("%d ",m[i][j]);
printf("\n");
}
*/
return 0;
}
大体思路
假设两个字符串str1和str2,长度分别为m和n,则构建一个m*n的矩阵matrix,
matrix[i][j]==1表示字符串str1中第i个字符与str2中第j个字符相等,为0则不相等。
统计矩阵matrix中每条斜线上1的连续最大个数就是str1和str2中公共连续子串的最大长度
例如:str1: abcde str2: abgde
斜线上连续的1的最大个数为2,所以最长公共连续子串长度为2
matrix = [ 1 0 0 0 0
0 1 0 0 0
0 0 0 0 0
0 0 0 1 0
0 0 0 0 1 ]