Longest Common Subsequence
来源:互联网 发布:剑三妖孽男捏脸数据 编辑:程序博客网 时间:2024/04/30 10:23
递归的解法是:
这个解法效率太低,可以采用动态规划的方法来解决,实现的代码如下:
#include <stdio.h>
int inline max(int a,int b)
{
return a >= b ? a : b;
}
int lcs(char * a, int la, char *b, int lb)
{
if(la < 0 || lb < 0 ) return 0;
if(a[la] == b[lb]) return 1 + lcs(a,la-1,b,lb-1);
else return max(lcs(a,la-1,b,lb), lcs(a,la,b,lb-1));
}
int main()
{
char a[1024];
char b[1024];
int la,lb;
while(1)
{
printf(":->");
if(fgets(a,1024,stdin) <= 0) break;
la = strlen(a) - 2;
printf(":->");
if(fgets(b,1024,stdin) <= 0) break;
lb = strlen(b) - 2;
printf(":->Common length is : %d ",lcs(a,la,b,lb));
}
//printf("the common length is : %d ",lcs(a,la,b,lb));
return 0;
}
int inline max(int a,int b)
{
return a >= b ? a : b;
}
int lcs(char * a, int la, char *b, int lb)
{
if(la < 0 || lb < 0 ) return 0;
if(a[la] == b[lb]) return 1 + lcs(a,la-1,b,lb-1);
else return max(lcs(a,la-1,b,lb), lcs(a,la,b,lb-1));
}
int main()
{
char a[1024];
char b[1024];
int la,lb;
while(1)
{
printf(":->");
if(fgets(a,1024,stdin) <= 0) break;
la = strlen(a) - 2;
printf(":->");
if(fgets(b,1024,stdin) <= 0) break;
lb = strlen(b) - 2;
printf(":->Common length is : %d ",lcs(a,la,b,lb));
}
//printf("the common length is : %d ",lcs(a,la,b,lb));
return 0;
}
这个解法效率太低,可以采用动态规划的方法来解决,实现的代码如下:
#include <stdio.h>
#include <string.h>
int commstr(char *str1, char *str2)
/* 返回str1,str2的最长公共之串长度*/
{
int len1=strlen(str1),len2=strlen(str2),row,col,max=0;
int **pf = new int*[len1+1];//动态分配一个二维数组作为辅助空间
for (row=0; row<len1+1; row++)
pf[row] = new int[len2+1];
//数组赋初值
for (row=0; row<len1+1; row++)
pf[row][0] = 0;
for (col=0; col<len2+1; col++)
pf[0][col] = 0;
for (row=1; row<=len1; row++)
for (col=1;col<=len2; col++)
{
if (str1[row-1] == str2[col-1])
{
pf[row][col] = pf[row-1][col-1] + 1;
max = pf[row][col] > max ? pf[row][col] : max;
}
else
pf[row][col] = 0;
}
//空间回收
for (row=0; row<len1+1; row++)
delete[] pf[row];
delete[] pf;
return max;
}
int main(int argc,char **argv)
{
if (argc >= 3)
{
printf("String: 1. %s 2. %s ",argv[1],argv[2]);
printf(" max substr length:%d ",commstr(argv[1],argv[2]));
}
return 0;
}
#include <string.h>
int commstr(char *str1, char *str2)
/* 返回str1,str2的最长公共之串长度*/
{
int len1=strlen(str1),len2=strlen(str2),row,col,max=0;
int **pf = new int*[len1+1];//动态分配一个二维数组作为辅助空间
for (row=0; row<len1+1; row++)
pf[row] = new int[len2+1];
//数组赋初值
for (row=0; row<len1+1; row++)
pf[row][0] = 0;
for (col=0; col<len2+1; col++)
pf[0][col] = 0;
for (row=1; row<=len1; row++)
for (col=1;col<=len2; col++)
{
if (str1[row-1] == str2[col-1])
{
pf[row][col] = pf[row-1][col-1] + 1;
max = pf[row][col] > max ? pf[row][col] : max;
}
else
pf[row][col] = 0;
}
//空间回收
for (row=0; row<len1+1; row++)
delete[] pf[row];
delete[] pf;
return max;
}
int main(int argc,char **argv)
{
if (argc >= 3)
{
printf("String: 1. %s 2. %s ",argv[1],argv[2]);
printf(" max substr length:%d ",commstr(argv[1],argv[2]));
}
return 0;
}
- longest common subsequence
- Longest Common Subsequence
- 10405 Longest Common Subsequence
- UVa10405 - Longest Common Subsequence
- 10405 - Longest Common Subsequence
- UVa10405 - Longest Common Subsequence
- UVaOJ10405 - Longest Common Subsequence
- 10405 - Longest Common Subsequence
- uva10405 Longest Common Subsequence
- 10405 - Longest Common Subsequence
- 10405 - Longest Common Subsequence
- Uva10405 Longest Common Subsequence
- UVaOJ_10405 - Longest Common Subsequence
- Longest common subsequence / substring
- uva10405 - Longest Common Subsequence
- longest common subsequence 问题
- [DP]Longest Common Subsequence
- UVA10405 Longest Common Subsequence
- 半路出家
- 今天想写个VSS 的使用说明?
- tcl/tk参考——控制结构continue
- Java中的正则表达式 包含embedded flags
- 2008-------------爷爷你要加油
- Longest Common Subsequence
- 用matlab得到有根区间向量
- secondlife完全指南攻略电子书
- [转载]MySQL忘记密码的解决方法(Windows, Linux)
- SecondLife即将进入中国,虚拟物品讨论再上台面
- Flickr 的开发者的 Web 应用优化技巧
- 图形显示CPU内存利用率
- C 和 C++ 字符串字面量的比较
- 解决Ajax乱码问题