最长公共子序列
来源:互联网 发布:三端口环行器 编辑:程序博客网 时间:2024/06/07 22:30
最长公共子序列问题是经典的动态规划问题:给定两个字符串str1和str2,返回两个字符串的最长公共子序列(不一定要连续)。
举例: str1="a1b2c3d4" str2="a2b3c4e" 它们的最长公共子串是"abc"
下面是c++代码实现
#include<iostream>#include<string>#include<vector>using namespace std;int main(){ string str1,str2; cin>>str1>>str2; int i,j; int **dp; *dp = new int[str1.size()]; for(int i=0;i<str1.size();i++){ dp[i] = new int[str2.size()]; } dp[0][0] = str1[0] ==str2[0] ?1:0; for(i =1;i<str1.size();i++){ dp[i][0] = max(dp[i-1][0],str1[i]==str2[0]?1:0); } for(i=1;i<str2.size();i++){ dp[0][i] = max(dp[0][i-1],str1[0]==str2[i]?1:0); } for(i =1;i<str1.size();i++){ for(j =1;j<str2.size();j++){ dp[i][j] = max(dp[i-1][j],dp[i][j-1]); if(str1[i]==str2[j]) dp[i][j] = max(dp[i][j],dp[i-1][j-1]+1); } } int maxlen = dp[str1.size()-1][str2.size()-1]; char *result = new char[maxlen]; int k = maxlen-1; i = str1.size()-1; j = str2.size()-1; while(k>=0){ if(i>0 && dp[i][j] ==dp[i-1][j]){ i--; }else if(j>0 && dp[i][j] ==dp[i][j-1]){ j--; }else{ result[k--] = str1[i]; i--; j--; } } cout<<result<<endl; return 0;}
0 0
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列...
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- C语言的符号表和类型系统2
- C#接口查询(QI)
- POJ3080-Blue Jeans
- BZOJ1649: [Usaco2006 Dec]Cow Roller Coaster 背包DP
- 剑指Offer——美团内推+校招笔试题+知识点总结
- 最长公共子序列
- Spring缓存注解@Cache使用
- java中的堆和栈
- 【WWDC2016 Session】iOS 10 推送Notification新特性
- USB 2.0 A型、B型、Mini和Micro接口 type-c 定义及封装
- MySQL创建Function时报错误码1418的解决方案
- count(*)和count(1)的区别
- 程序启动及程序的生命周期
- android key 事件派发