最长公共子序列(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
原创粉丝点击