ZOJ 1733 最长公共子串
2010-05-12 11:03
375 查看
////////////////////////////////////////////////////////////////////
//最长公共子串
//dp经典例题
#include<iostream>
#include<string>
using namespace std;
char x[10000],y[10000];
void LCSLength(int m,int n,char *x,char *y,int **c,int **b)
{
int i,j;
for(i=0;i<=m;i++)
c[i][0]=0;
for(i=1;i<=n;i++)
c[0][i]=0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
if(x[i-1]==y[j-1]) //注意x[],y[]输入中是从0开始的
{
c[i][j]=c[i-1][j-1]+1;
b[i][j]=1;
}
else if(c[i-1][j]>=c[i][j-1])
{
c[i][j]=c[i-1][j];
b[i][j]=2;
}
else
{
c[i][j]=c[i][j-1];
b[i][j]=3;
}
}
}
/*
void LCS(int i,int j,char *x, int **b)
{
if(i==0||j==0)
return ;
if(b[i][j]==1)
{
LCS(i-1,j-1,x,b);
cout<<x[i-1];
}
else if(b[i][j]==2)
LCS(i-1,j,x,b);
else
LCS(i,j-1,x,b);
}
*/
int main()
{
int m,n,i;
while(cin>>x>>y)
{
m=strlen(x);
n=strlen(y);
int **ptrc=new int*[m+1];
int **ptrb=new int*[m+1];
for(i=0;i<=m;i++)
{
ptrc[i]=new int[n+1];
ptrb[i]=new int[n+1];
}
LCSLength(m,n,x,y,ptrc,ptrb);
// LCS(m,n,x,ptrb);
cout<<ptrc[m]
<<endl;
}
return 0;
}
//最长公共子串
//dp经典例题
#include<iostream>
#include<string>
using namespace std;
char x[10000],y[10000];
void LCSLength(int m,int n,char *x,char *y,int **c,int **b)
{
int i,j;
for(i=0;i<=m;i++)
c[i][0]=0;
for(i=1;i<=n;i++)
c[0][i]=0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
if(x[i-1]==y[j-1]) //注意x[],y[]输入中是从0开始的
{
c[i][j]=c[i-1][j-1]+1;
b[i][j]=1;
}
else if(c[i-1][j]>=c[i][j-1])
{
c[i][j]=c[i-1][j];
b[i][j]=2;
}
else
{
c[i][j]=c[i][j-1];
b[i][j]=3;
}
}
}
/*
void LCS(int i,int j,char *x, int **b)
{
if(i==0||j==0)
return ;
if(b[i][j]==1)
{
LCS(i-1,j-1,x,b);
cout<<x[i-1];
}
else if(b[i][j]==2)
LCS(i-1,j,x,b);
else
LCS(i,j-1,x,b);
}
*/
int main()
{
int m,n,i;
while(cin>>x>>y)
{
m=strlen(x);
n=strlen(y);
int **ptrc=new int*[m+1];
int **ptrb=new int*[m+1];
for(i=0;i<=m;i++)
{
ptrc[i]=new int[n+1];
ptrb[i]=new int[n+1];
}
LCSLength(m,n,x,y,ptrc,ptrb);
// LCS(m,n,x,ptrb);
cout<<ptrc[m]
<<endl;
}
return 0;
}
相关文章推荐
- ZOJ 1642 带权的最长公共子串
- zoj上1733是求最长公共自序列吗?
- 【KMP多串最长公共子串】POJ 3080
- 字符串应用之最长公共子序列和最长公共子串
- 【字符串匹配】【后缀数组】17.2.9 T3 最长公共子串 题解
- [URAL-1517][求两个字符串的最长公共子串]
- 数据结构:LCS最长公共子串 动态规划DP + DFS深度优先遍历
- 求两个字符串的最长公共子串
- 最长公共子序列(LCS)和最长公共子串(LCSubString)
- 最长公共子序列&&最长公共子串
- 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和
- 最长公共子串――动态规划
- 今天开始学Java 查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
- 寻找两个字符串中最长的公共子串源码(不使用strcmp)
- poj 2774 最长公共子串(后缀数组)
- (串的模式匹配4.6.1)POJ 3080 Blue Jeans(使用朴素的模式匹配算法求最长的公共子串)
- lintcode最长公共子串
- ju 2432Greatest Common Increasing Subsequence 最长公共上升子串-dp
- LCS (Longest Common Subsequence) 字符串最长公共子串算法
- OJ------查找两个字符串a,b中的最长公共子串