最长公共子序列

题目描述

给你一个序列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;
    }
}
posted @ 2025-09-18 03:26  Lantz12  阅读(13)  评论(0)    收藏  举报