【1】求最长公共子序列 要求可以不连续 不输出,只求长度;
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
using namespace std;
#define N 100000
int s[10000][1000];
char a[100],b[100];
int LCS()
{
int i,j;
for(i=0; i<=strlen(a); i++)
{
s[i][0]=0;
// puts("****");
}
for(j=0; j<=strlen(b); j++)
{
s[0][j]=0;
}
for(i=1; i<=strlen(a); i++)
{
for(j=1; j<=strlen(b); j++)
{
if(a[i-1]==b[j-1])
{
s[i][j]=s[i-1][j-1]+1;
}
else
{
if(s[i-1][j]>=s[i][j-1])
{
s[i][j]=s[i-1][j];
}
else if(s[i-1][j]<s[i][j-1])
{
s[i][j]=s[i][j-1];
}
}
// printf("%d %d %d\n",s[i][j],i,j);
}
}
return s[strlen(a)][strlen(b)];//
}
int main()
{
scanf("%s",a);
scanf("%s",b);
int len=LCS();
cout<<len<<endl;
}
【2】输出长度
用一个二维数组进行标记:
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
using namespace std;
#define N 100000
int s[10000][1000];
char a[100],b[100];
int vis[10000][1000];
int LCS()
{
int i,j;
for(i=0; i<=strlen(a); i++)
{
s[i][0]=0;
// puts("****");
}
for(j=0; j<=strlen(b); j++)
{
s[0][j]=0;
}
for(i=1; i<=strlen(a); i++)
{
for(j=1; j<=strlen(b); j++)
{
if(a[i-1]==b[j-1])
{
s[i][j]=s[i-1][j-1]+1;
vis[i][j]=1;
}
else
{
if(s[i-1][j]>=s[i][j-1])
{
s[i][j]=s[i-1][j];
vis[i][j]=2;
}
else if(s[i-1][j]<s[i][j-1])
{
s[i][j]=s[i][j-1];
vis[i][j]=3;
}
}
}
}
return s[strlen(a)][strlen(b)];//
}
void printstring(int i,int j)
{
if(i==0||j==0)
{
return ;
}
else
{
if(vis[i][j]==1)
{
printstring(i-1,j-1);
printf("%c ",a[i-1]);
}
else if(vis[i][j]==2)
{
printstring(i-1,j);
}
else
{
printstring(i,j-1);
}
}
}
int main()
{
scanf("%s",a);
scanf("%s",b);
int len=LCS();
cout<<len<<endl;
printstring(strlen(a),strlen(b));
}
【3】求最长子串
要求必须连续,不输出串,只输出长度;
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
using namespace std;
#define N 100000
int s[10000][1000];
char a[100],b[100];
int vis[10000][1000];
int LCS()
{
int i,j;
int len=0;
for(i=0; i<=strlen(a); i++)
{
s[i][0]=0;
}
for(j=0; j<=strlen(b); j++)
{
s[0][j]=0;
}
for(i=1; i<=strlen(a); i++)
{
for(j=1; j<=strlen(b); j++)
{
if(a[i-1]==b[j-1])
{
s[i][j]=s[i-1][j-1]+1;
if(len<s[i][j])
{
len=s[i][j];
}
}
else
{
s[i][j]=0;
}
}
}
return len;
}
int main()
{
scanf("%s",a);
scanf("%s",b);
int len=LCS();
cout<<len<<endl;
}
【4】求最长子串,输出
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
using namespace std;
#define N 100000
int s[10000][1000];
char a[100],b[100];
int vis[10000][1000];
int LCS()
{
int i,j;
int len=0;
for(i=0; i<=strlen(a); i++)
{
s[i][0]=0;
}
for(j=0; j<=strlen(b); j++)
{
s[0][j]=0;
}
for(i=1; i<=strlen(a); i++)
{
for(j=1; j<=strlen(b); j++)
{
if(a[i-1]==b[j-1])
{
s[i][j]=s[i-1][j-1]+1;
if(len<s[i][j])
{
len=s[i][j];
}
vis[i][j]=1;
}
else
{
s[i][j]=0;
}
}
}
return len;
}
void printstring(int i,int j)
{
if(i==0||j==0)
{
return ;
}
else
{
if(vis[i][j]==1)
{
printstring(i-1,j-1);
printf("%c ",a[i-1]);
}
else
{
printstring(i-1,j-1);
}
}
}
int main()
{
scanf("%s",a);
scanf("%s",b);
int len=LCS();
cout<<len<<endl;
printstring(strlen(a),strlen(b));
}