输出最长公共子序列字母表顺序
来源:互联网 发布:ubuntu squid3 配置 编辑:程序博客网 时间:2024/04/29 23:14
要找到LCS,可以使用一个二维数组来记录每一格的结果,是由哪一格而来,从最后一个结果往回追溯,如果发现了某个maxlen[i][j]是由maxlen[i-1][j-1]+1而得到的,便可知这个时候的str1[i],str2[j]是使LCS增长的元素,此时输出str1[i-1]或者str2[j-1]即可。而如果要输出LCS的字母表顺序,先把LCS存在一个数组中,再进行字母表排序,最后输出即可。
在这里,我用1代表是由左上元素而来,2代表由上方元素而来,3代表由左方元素而来。
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int Max=1000;char str1[Max+10];char str2[Max+10];char str[Max+10];int p[Max+10][Max+10];int maxlen[Max+10][Max+10];int cnt=0;void print(int i,int j){ if(i==0||j==0){ cnt=0; return; } else if(p[i][j]==1){ print(i-1,j-1); str[cnt++]=str1[i-1]; } else if(p[i][j]==2) print(i-1,j); else if(p[i][j]==3) print(i,j-1);}int main(){ while(gets(str1)){ gets(str2); int l1=strlen(str1); int l2=strlen(str2); for(int i=0;i<=l1;i++) maxlen[i][0]=0; for(int i=0;i<=l2;i++) maxlen[0][i]=0; for(int i=1;i<=l1;i++){ for(int j=1;j<=l2;j++){ if(str1[i-1]==str2[j-1]){ maxlen[i][j]=maxlen[i-1][j-1]+1; p[i][j]=1; } else if(maxlen[i-1][j]>maxlen[i][j-1]){ maxlen[i][j]=maxlen[i-1][j]; p[i][j]=2; } else{ maxlen[i][j]=maxlen[i][j-1]; p[i][j]=3; } } } print(l1,l2); sort(str,str+cnt); for(int i=0;i<cnt;i++) printf("%c",str[i]); printf("\n"); }}
0 0
- 输出最长公共子序列字母表顺序
- 输出最长公共子序列
- 输出最长公共子序列
- 输出最长公共子序列
- 输出最长公共子序列
- 输出所有的最长公共子序列
- **输出最长公共子序列-字符串
- 最长公共子序列及其输出
- 输出所有的最长公共子序列
- LCS 最长公共子序列并输出该序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列...
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 中文在C/C++中的处理和汉字乱码问题
- TC/UDPP网络编程
- N进制转换为10进制
- 中文在C/C++中的处理和汉字乱码问题
- TC/UDPP网络编程
- 输出最长公共子序列字母表顺序
- Broken Keyboard (a.k.a. Beiju Text) UVA, 11988(链表)
- Javascript异步编程的4种方法
- OpenCV 3.0 使用GDAL例程
- jQuery的deferred对象详解
- 阿里云CentOS6.4安装jdk;mysql;tomcat
- C++晋升之typeid
- 随笔之得到要付出代价
- 设置MyEclipse编码格式