最长公共子序列(LCS)
来源:互联网 发布:2017网络英文热词 编辑:程序博客网 时间:2024/06/03 12:28
问题描述:给定两个字符串s1s2...sn和t1t2...tn。求出这两个字符串最长的公共子序列的长度。字符串s1s2...sn的子序列指可以表示为Si1Si2...Sim(i1<i2<...<im)的序列。
限制条件
1<=n,m<=1000
样例
输入
n=4
m=4
S="abcd"
T="becd"
输出
3(“bcd”)
分析:
设置一个二维数组,dp[n+1[n+1],当检查到Si+1与Ti+1时,有以下三种情况:
1.相等,则在dp[i+1][j+1]中赋dp[i][j]+1。
2.不相等,则S1到Si+1和T1到Ti+1对应的公共子序列是S1...Si和T1...Tj+1或者S1...Si+1和T1...Tj的子序列。此时dp[i+1][j+1]应赋值为max(dp[i][j+1],dp[i+1][j])
另外,在给出S和T的时候,我认为m是没有用处的,m必须与n同值,否则无法保证结果的长度正确。
代码如下:
#include<algorithm>#include<iostream>using namespace std;int n, m;//n为实例字符串长度,m为子序列长度,个人认为m没有一点用处char s[1000], t[1000];//字符串int dp[1001][1001];//记忆化数组,为最大值加1防止溢出void solve(){for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){if (s[i + 1] == t[j + 1]){dp[i + 1][j + 1] = dp[i][j] + 1;//如果相等,则加一}else{dp[i + 1][j + 1] = max(dp[i][j + 1], dp[i + 1][j]);}}}cout << dp[n][m];}
0 0
- 最长公共子序列(LCS)
- 最长公共子序列(LCS)问题
- 最长公共子序列(LCS)问题
- 求最长公共子序列(LCS)
- 最长公共子序列算法(LCS)
- LCS(最长公共子序列)
- 最长公共子序列(LCS)问题
- 最长公共子序列(LCS问题)
- Coincidence(LCS最长公共子序列)
- 最长公共子序列(LCS)
- 最长公共子序列(LCS)问题
- 最长公共子序列(LCS)问题
- 最长公共子序列(LCS)
- 最长公共子序列(LCS)
- 最长公共子序列(LCS)
- hdu1243 最长公共子序列(LCS)
- 最长公共子序列(LCS)
- 最长公共子序列(LCS)问题
- 7对数字
- Java多线程-实例解析
- 实现SDK的打包处理
- (@WhiteTaken)设计模式学习——工厂方法模式
- Linux下MPI并行编程环境搭建配置
- 最长公共子序列(LCS)
- mysql常用语句——结合select的insert语句
- 深入.NET和C#第二章上机3
- linux下的编辑器notepadqq
- R 知识片段
- 使用opencv_traincascade训练级联分类器检测手掌(一)
- ble收藏
- 建造者模式——Builder Pattern
- 一看你就懂,超详细java中的ClassLoader详解