最长公共子序列
题目描述
给你一个序列X和另一个序列Z,当Z中的所有元素都在X中存在,并且在X中的下标顺序是严格递增的,那么就把Z叫做X的子序列。
例如:Z=是序列X=的一个子序列,Z中的元素在X中的下标序列为<1,2,4,6>。
现给你两个序列X和Y,请问它们的最长公共子序列的长度是多少?
输入描述
输入包含多组测试数据。每组输入占一行,为两个字符串,由若干个空格分隔。每个字符串的长度不超过100。
输出描述
对于每组输入,输出两个字符串的最长公共子序列的长度。
输入示例
abcfbc abfcab
programming contest
abcd mnp
输出示例
4
2
0
Java 代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String str1 = scanner.next();
String str2 = scanner.next();
System.out.println(lcs(str1, str2));
}
scanner.close();
}
// 动态规划解决最长公共子序列问题
private static int lcs(String str1, String str2) {
int m = str1.length();
int n = str2.length();
int[][] dp = new int[m+1][n+1];
for (int i = 0; i <= m; i++) {
for (int j = 0; j <= n; j++) {
if (i == 0 || j == 0) {
dp[i][j] = 0;
} else if (str1.charAt(i-1) == str2.charAt(j-1)) {
dp[i][j] = dp[i-1][j-1] + 1;
} else {
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
}
}
}
return dp[m][n];
}
}
C++ 代码
#include<iostream>
#include<vector>
using namespace std;
int f[110][110]; //到i,j有多少相同的元素
int main(){
string x; string y;
while(cin>>x>>y){
for(int i=1;i<=x.size();i++){
for(int j=1;j<=y.size();j++){
f[i][j]=max(f[i-1][j],f[i][j-1]);
if(x[i-1]==y[j-1]) f[i][j]=max(f[i-1][j-1]+1,f[i][j]);
}
}
cout<< f[x.size()][y.size()]<<endl;
}
}

浙公网安备 33010602011771号